Meh*_*dad 59 c c++ types unsigned-char uint8t
根据C和C++ , CHAR_BIT >= 8.
但无论何时CHAR_BIT > 8,uint8_t甚至都不能表示为8位.
它必须更大,因为它CHAR_BIT是系统上任何数据类型的最小位数.
什么样的系统可以uint8_t合法地定义为除了以外的类型unsigned char?
(如果C和C++的答案不同,那么我想知道两者.)
R..*_*R.. 57
如果存在,则uint8_t必须始终具有相同的宽度unsigned char.但是,它不一定是同一类型; 它可能是一个独特的扩展整数类型.它也不需要具有相同的表示unsigned char; 例如,可以以相反的顺序解释比特.这是一个愚蠢的例子,但它更有意义int8_t,signed char可能是补充或符号幅度,而int8_t需要两个补码.
使用非char扩展整数类型uint8_t甚至在"普通"系统上的另一个"优点" 是C的别名规则.允许字符类型别名,这可以防止编译器大量优化使用字符指针和指向其他类型的指针的函数,除非restrict关键字已经很好地应用.然而,即使uint8_t具有完全相同的大小和表示形式unsigned char,如果实现做了它独特的,非字符类型,别名规则并不适用于它,编译器可以假设的类型的对象uint8_t和int,例如,可以从不别名.
aut*_*tic 30
什么样的系统可以
uint8_t合法地定义为除了以外的类型unsigned char?
总之,uint8_t只能在CHAR_BIT8的系统上合法定义.它是一个可寻址单元,具有8个值位且没有填充位.
详细说明,CHAR_BIT定义最小可寻址单元的宽度,uint8_t不能有填充位; 它只能在最小可寻址单元正好为8位宽时存在.提供CHAR_BIT为8,uint8_t可以由任何没有填充位的8位无符号整数类型的类型定义来定义.
以下是C11标准草案(n1570.pdf)所说的内容:
5.2.4.2.1整数类型的大小 1下面给出的值应替换为适用于#if预处理指令的常量表达式.......它们的实现定义值的大小(绝对值)应等于或大于显示的值,并带有相同的符号.
Run Code Online (Sandbox Code Playgroud)-- number of bits for smallest object that is not a bit-field (byte) CHAR_BIT 8
因此,最小的对象必须包含精确的CHAR_BIT位.
6.5.3.4 sizeof和_Alignof运算符
...
4当sizeof应用于具有char,unsigned char或signed char(或其合格版本)类型的操作数时,结果为1. ...
因此,那些是(一些)最小的可寻址单元.显然int8_t,uint8_t并且也可以被认为是最小的可寻址单元,只要它们存在.
7.20.1.1精确宽度整数类型
1 typedef名称intN_t指定带符号的整数类型,其宽度为N,无填充位和二进制补码表示.因此,int8_t表示这样的带符号整数类型,其宽度恰好为8位.
2 typedef名称uintN_t指定宽度为N且无填充位的无符号整数类型.因此,uint24_t表示这样的无符号整数类型,其宽度恰好为24位.
3 这些类型是可选的.但是,如果实现提供宽度为8,16,32或64位的整数类型,没有填充位,并且(对于具有二进制补码表示的有符号类型),它应定义相应的typedef名称.
强调" 这些类型是可选的 "是我的.我希望这可以帮到你 :)
迄今为止没有人提到的可能性:if CHAR_BIT==8和unqualified char是无符号的,它在某些ABI中,那么uint8_t可能是typedef char而不是unsigned char.这至少在影响过载选择(及其邪恶的双胞胎,名称修改)的情况下是重要的,即如果你同时拥有两个foo(char)并且foo(unsigned char)在范围内,foo使用类型的参数调用uint8_t将更喜欢foo(char)这样的系统.