是否有标准投诉方法来表示 ANSI (C89/90) C 中的字节?我知道,大多数情况下,一个字符恰好是一个字节,但我的理解是,不能保证是这种情况。另外,C99 标准中有 stdint.h,但 C99 之前使用的是什么?
我对 8 位和一个“字节”(sizeof(x) == 1)都很好奇。
char
始终是byte,但并不总是octet。一个字节是最小的可寻址内存单元(在大多数定义中),一个八位字节是 8 位内存单元。
也就是说,对于所有实现,sizeof(char)
始终为1CHAR_BIT
,但宏limits.h
定义了平台的字节大小,并不总是 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。[...]
强调我的。
您始终可以在无符号字符中表示一个字节(如果您的意思是 8 位)。它的大小始终至少为 8 位,所有位都构成了该值,因此 8 位值将始终适合它。
如果你想要 8 位,我也认为你必须使用平台相关的方式。POSIX 系统似乎需要支持 int8_t。这意味着在 POSIX 系统上,char(因此是一个字节)总是 8 位。
在 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 ”。
在C99之前?平台相关代码。
但你为什么在乎?只需使用 stdint.h。
在使用的每个 CI 实现中(从旧的 UNIX 到硬件工程师编写的嵌入式编译器再到大供应商的编译器)char
一直是 8 位的。
你可以在 boost 中找到相当可靠的宏和 typedef。
我注意到有些回答已将单词字节重新定义为 8 位以外的含义。一个字节是 8 位,但是在某些 c 实现中 char 是 16 位(2 字节)或 8 位(1 字节)。将字节称为“最小可寻址内存单元”或某些此类垃圾的人已经失去了对字节(8位)含义的理解。C 的一些实现有 16 位字符(2 个字节)和一些有 8 位字符(1 个字节),并且没有称为“字节”的标准类型的原因是由于懒惰。
所以,我们应该使用 int_8