根据C和C++,CHAR_BIT >= 8
。
但是,无论何时CHAR_BIT > 8
,uint8_t
都不能表示为8位。
它必须更大,因为CHAR_BIT
是系统上任何数据类型的最小位数。
在哪种系统上,uint8_t
可以合法地定义为unsigned char
以外的类型?
(如果C和C++的答案不同,那么我想知道两者。)
发布于 2013-04-22 02:17:49
如果存在,uint8_t
必须始终具有与unsigned char
相同的宽度。但是,它不一定是相同的类型;它可能是一个不同的扩展整数类型。它也不需要具有与unsigned char
相同的表示形式;例如,可以用相反的顺序来解释比特。这是一个愚蠢的例子,但对于int8_t
来说更有意义,在这里,signed char
可能是1,补码或符号大小,而int8_t
被要求是两个补码。
对uint8_t
使用非字符扩展整数类型的另一个“优势”是C的混叠规则。允许字符类型别名任何东西,这会阻止编译器对同时使用字符指针和指向其他类型的指针的函数进行严格优化,除非restrict
关键字应用得很好。然而,即使uint8_t
具有与unsigned char
完全相同的大小和表示形式,如果实现使其成为一个不同的非字符类型,则别名规则将不适用于它,编译器可以假设类型为uint8_t
和int
的对象永远不能别名。
发布于 2013-04-22 01:54:21
在哪种系统上,
uint8_t
可以合法地定义为unsigned char
以外的类型?
总之,uint8_t
只能在CHAR_BIT
为8的系统上合法定义,它是一个可寻址的单元,只有8位值,没有填充位。
详细地说,CHAR_BIT
定义最小可寻址单元的宽度,而uint8_t
不能有填充位;它只能存在于最小可寻址单元正好8位宽的情况下。如果CHAR_BIT
为8,则可以为没有填充位的任何8位无符号整数类型定义类型定义。
以下是C11标准草案(n1570.pdf)的内容:
5.2.4.2.1整数类型的大小(1)下面给出的值应替换为适合于#if预处理指令中使用的常量表达式。..。它们的实现定义值应等于或大于所显示的值(绝对值),并具有相同的符号。 -非位字段(字节) CHAR_BIT 8的最小对象的位数
因此,最小的对象必须准确地包含CHAR_BIT位。
6.5.3.4规模和_Alignof运算符 ..。 4当对具有char、un符号char或已签名char (或其限定版本)的操作数应用sizeof时,结果为1。
因此,这些是(一些)最小的可寻址单位。显然,int8_t
和uint8_t
也可以被认为是最小的可寻址单元,只要它们存在。
7.20.1.1精确宽度整数类型 1类型胡枝子名称intN_t指定一个带符号整数类型,其宽度为N,没有填充位,并指定两个补码表示形式。因此,int8_t表示这种宽度正好为8位的带符号整数类型。 2类型胡枝子名称uintN_t指定宽度为N且没有填充位的无符号整数类型。因此,uint24_t表示这种宽度正好为24位的无符号整数类型。 3这些类型是可选的。但是,如果实现提供宽度为8、16、32或64位的整数类型,没有填充位,并且(对于有符号类型)具有两个补码表示的整数类型,则它将定义相应的类型类型。
我的重点是“--这些类型是可选的”。我希望这是有帮助的:)
发布于 2013-04-24 22:30:29
到目前为止还没有人提到过这样的可能性:如果CHAR_BIT==8
和不合格的char
是无符号的(在某些ABI中是这样的),那么uint8_t
可能是char
(而不是unsigned char
)的typedef。这至少是因为它影响了过载选择(以及它的邪恶孪生,名称损坏),也就是说,如果您的作用域同时有foo(char)
和foo(unsigned char)
,那么使用uint8_t
类型的参数调用foo
会更倾向于在这样的系统上使用foo(char)
。
https://stackoverflow.com/questions/16138237
复制相似问题