用于表示ANSI(C89 / 90)C中的字节的类型?

时间:2009-01-12 23:31:52

标签: c types c89

是否有标准投诉方法来表示ANSI(C89 / 90)C中的字节?我知道,大多数情况下,一个字符恰好是一个字节,但我的理解是,这不能保证是这种情况。此外,在C99标准中有stdint.h,但在C99之前使用了什么?

我特别想知道8位和“字节”(sizeof(x)== 1)。

6 个答案:

答案 0 :(得分:63)

char始终是字节,但它并不总是八位字节。字节是存储器的最小可寻址单位(在大多数定义中),八位字节是8位的存储单元。

也就是说,sizeof(char)对于所有实现总是 1 ,但CHAR_BIT中的limits.h宏定义了平台的字节大小,它是并不总是8位。有些平台具有16位和32位字节,因此char将占用更多位,但它仍然是一个字节。由于char的所需范围至少为-127到127(或0到255),因此在所有平台上至少 8位。

  

ISO / IEC 9899:TC3

     

6.5.3.4 sizeof运算符

     
      
  1. ...
  2.   
  3. sizeof运算符生成其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。 [...]
  4.   
  5. 当应用于类型为charunsigned charsigned char的操作数(或其合格版本)时,结果为 1 。 [...]
  6.   

强调我的。

答案 1 :(得分:9)

您总是可以在unsigned char中表示一个字节(如果您的意思是8位)。它始终至少为8位,所有位都构成该值,因此8位值始终适合它。

如果你想要8位,我也认为你必须使用平台相关的方式。 POSIX系统似乎是required来支持int8_t。这意味着在POSIX系统上,char(因而是一个字节)总是8位。

答案 2 :(得分:3)

在ANSI C89 / ISO C90 sizeof(char)== 1.但是,并非总是1字节是8位的情况。如果你想计算1个字节的位数(并且你没有访问limits.h),我建议如下:

unsigned int bitnum(void) {
    unsigned char c = ~0u; /* Thank you Jonathan. */
    unsigned int v;

    for(v = 0u; c; ++v)
        c &= c - 1u;
    return(v);
}

这里我们使用Kernighan的方法来计算 c 中设置的位数。为了更好地理解上面的代码(或者看到其他代码),我建议您使用“Bit Twiddling Hacks”。

答案 3 :(得分:1)

在C99之前?与平台相关的代码。

但你为什么关心?只需使用stdint.h。

在C的每个实现中,我使用过(从旧的UNIX到由硬件工程师编写的嵌入式编译器到大型供应商编译器)char一直是8位。

答案 4 :(得分:-2)

你可以在boost中找到非常可靠的宏和typedef。

答案 5 :(得分:-4)

我注意到有些回答已经将字节重新定义为8位以外的东西。 字节是8位,但是在某些c实现中,char是16位(2字节)或8位(1字节)。调用字节“最小可寻址存储器单元”或某些垃圾的人已经忘记了字节(8位)的含义。 C的一些实现有16位字符(2字节),有些具有8位字符(1字节),并且没有标准类型称为'字节',这是由于懒惰。

所以,我们应该使用int_8