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

用于在ANSI(C89/90)C中表示字节的类型?,c,types,c89,C,Types,C89,在ANSI(C89/90)C中是否有表示字节的标准方法?我知道,大多数情况下,一个字符恰好是一个字节,但我的理解是,这种情况并不一定会发生。另外,C99标准中有stdint.h,但在C99之前使用了什么 我对8位和一个“字节”(sizeof(x)==1)特别好奇。在C99之前?平台相关代码 但你为什么在乎?只要使用stdint.h 在我使用过的每个C实现中(从旧的UNIX到硬件工程师编写的嵌入式编译器,再到大型供应商的编译器)char始终是8位的。您可以在boost中找到非常可靠的宏和typed

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


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

在C99之前?平台相关代码

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


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

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

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


如果您想要正好8位,我还认为您必须使用依赖于平台的方式。POSIX系统似乎支持int8\t。这意味着在POSIX系统上,char(以及一个字节)总是8位

char
总是一个字节,但并不总是一个八位字节。字节是最小的可寻址内存单元(在大多数定义中),八位字节是8位的内存单元

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

ISO/IEC 9899:TC3 6.5.3.4操作员的尺寸
  • sizeof运算符生成其操作数的大小(以字节为单位),可以是表达式或类型的括号名称。[……]
  • 当应用于类型为
    char
    无符号char
    有符号char
    (或其限定版本)的操作数时,结果为1。[……]
  • 强调矿山。

    在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中设置的位数。为了更好地理解上面的代码(或看到其他类似的代码),请参阅“。

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


    那么,我们应该使用int_8

    那么你的建议是使用uint8_t还是使用无符号字符?有趣的是,当我上学时,字符是6位的。小写成本12位!我想你不会错过我们曾经使用过的36位、60位和其他有趣的机器。对stdint.h post dates C99.ah的POSIX支持。是的。看起来像是从2001年开始的。但我认为,即使他没有c99编译器,如果他在posix机器上,他也可以利用stdint.h的要求。如果他在微软视窗上,我的赌注就全输了:)也许他可以从boost的cstdint.hpp中提取一些东西并将其加密?我是说一个字节,不一定是8位,但谢谢。另一方面,规范是说它必须至少是8位,还是恰好是这样?是的,c标准文档限制。h要求UCHAR_MAX至少是255位,没有填充位,并且使用纯二进制。char必须具有与unsigned char或signed char相同的范围和表示形式,但必须是不同的类型。您可以从中复制/粘贴所需的内容。如果您只需要某个长度的可靠整数类型,则没有什么特别的;在1的补码或符号大小机器上,-1可能不是所有的位集~“0保证是所有位的集合。@乔纳森:这是有道理的。谢谢你的建议。我现在正在编辑这篇文章。(很抱歉,我编辑了这么多次此评论!)-1始终都是一位。-1到无符号字符的转换不一定是保位(截断)的,它是数学定义的:-N是(2^char\u位-(N mod(2^char\u位)),这意味着,-1始终是最高的无符号字符,具有所有位1。符号表示法的区别在于,如果你有两个补码,那么转换是概念性的:位模式不会改变:@R:这怎么可能?1的补码意味着,对于16位整数,-1是%11111111-11111110,因为要生成负数,位只需翻转()。只有两个的补码-1是%11111111-11111111,即0x7FFFF+1(这是许多CPU设置溢出标志的时候)。请确保区分字节和八位字节。sizeof(char)=1 always,这意味着char始终是一个字节。然而,字节并不总是八位字节(DEC Alpha字节是10位,IIRC…八位字节定义为8位)。char所需的范围实际上是-127到127(不要忘记,某些体系结构使用有符号幅度或补码整数表示)或0到255,这取决于char是有符号的还是无符号的。8位2的补码支持-128到127,而不是-127到128。@Chris:byte=内存的最小可寻址单元。我不知道你的问题是什么意思。小于8位字节意味着平台不能兼容C。没有意识到C要求>=8位字节(事实上,