35

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

我对 8 位和一个“字节”(sizeof(x) == 1)都很好奇。

4

6 回答 6

68

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 运算符

  1. ...
  2. sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。[...]
  3. 当应用于具有 , 或 , 类型(或其限定版本)的操作数时charunsigned char结果signed char1。[...]

强调我的。

于 2009-01-13T00:59:40.543 回答
11

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

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

于 2009-01-13T00:38:19.603 回答
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 ”。

于 2009-01-13T01:24:29.823 回答
1

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

但你为什么在乎?只需使用 stdint.h。

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

于 2009-01-12T23:34:38.687 回答
-3

你可以在 boost 中找到相当可靠的宏和 typedef。

于 2009-01-12T23:35:11.617 回答
-5

我注意到有些回答已将单词字节重新定义为 8 位以外的含义。一个字节是 8 位,但是在某些 c 实现中 char 是 16 位(2 字节)或 8 位(1 字节)。将字节称为“最小可寻址内存单元”或某些此类垃圾的人已经失去了对字节(8位)含义的理解。C 的一些实现有 16 位字符(2 个字节)和一些有 8 位字符(1 个字节),并且没有称为“字节”的标准类型的原因是由于懒惰。

所以,我们应该使用 int_8

于 2011-06-12T02:24:09.363 回答