是否有符合标准的方法在 ANSI (C89/90) C 中表示字节?我知道通常情况下,char 恰好是一个字节,但我理解这并不保证一定成立。此外,在 C99 标准中有 stdint.h,但在 C99 之前使用了什么?
我对8位特定和“字节”(sizeof(x) == 1)都很感兴趣。
是否有符合标准的方法在 ANSI (C89/90) C 中表示字节?我知道通常情况下,char 恰好是一个字节,但我理解这并不保证一定成立。此外,在 C99 标准中有 stdint.h,但在 C99 之前使用了什么?
我对8位特定和“字节”(sizeof(x) == 1)都很感兴趣。
char
一直是一个字节,但它并不总是一个八位组。字节是存储单元的最小寻址单位(在大多数定义中),八位组则是8位的存储单元。
也就是说,对于所有实现,sizeof(char)
总是1,但是 limits.h
中的 CHAR_BIT
宏定义了平台上字节的大小,它并不总是8位。有些平台具有16位和32位的字节,因此char
将占用更多位,但它仍然是一个字节。由于char
所需的范围至少为-127到127(或0到255),因此在所有平台上,它至少是8位。
ISO/IEC 9899:TC3
6.5.3.4 sizeof运算符
- ...
- sizeof运算符产生其操作数的大小(以字节为单位),其操作数可以是表达式或类型的括号名称。[...]
- 当应用于类型为
char
、unsigned char
或signed char
(或其限定版本)的操作数时,结果为1。[...]
强调是我自己加的。
char
,并且是符合标准的,但是所有更大的类型都必须占据一个整数(和对齐)数量的这种逻辑字节(即,你不能拥有由3个硬件字节组成的21位整数,除非你随它一起包含额外的7位填充(第二个char
的其余部分)。 - R.. GitHub STOP HELPING ICE如果你指的是8位字节,那么你可以始终使用unsigned char来表示一个字节。它的大小至少为8位,所有位都组成值,因此8位值总是适合它的。
如果你需要确切的8位,我认为你还必须使用平台相关的方法。POSIX系统似乎必须支持int8_t。这意味着在POSIX系统上,char(因此也是字节)始终为8位。
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中设置位的数量。 为了更好地理解上面的代码(或查看类似的代码),我建议您参考“位操作技巧”。
C99之前?与平台相关的代码。
但你为什么要关心呢?只需要使用stdint.h即可。
在我所使用过的每个C实现中(从旧的UNIX到硬件工程师编写的嵌入式编译器再到大厂商编译器),char
始终是8位。
在boost中可以找到相当可靠的宏和typedef。
int8_t
要求没有填充位(并且采用二进制补码表示),因此它存在的唯一方式是 char
恰好为 8 位。 - R.. GitHub STOP HELPING ICE