unsigned char总是被提升为int吗?

Vil*_*ray 7 c c99 type-conversion integer-promotion type-promotion

假设如下:

unsigned char foo = 3;
unsigned char bar = 5;

unsigned int shmoo = foo + bar;
Run Code Online (Sandbox Code Playgroud)

是否保证将值foobar值提升为int表达式评估的值foo + bar- 或者是否允许实现它们的实现unsigned int

第6.2.5节第8段中:

对于具有相同签名和不同整数转换等级的任何两个整数类型(参见6.3.1.1),具有较小整数转换等级的类型的值范围是另一种类型的值的子范围.

第6.2.5节第9段中:

如果a int可以表示原始类型的所有值,则该值将转换为int; 否则,它被转换为unsigned int.

保证具有较小整数转换等级的整数类型具有作为另一类型的值的子范围的值的范围似乎取决于整数类型的有符号性.

  • signed char 对应于 signed int
  • unsigned char 对应于 unsigned int

这是否意味着a的值unsigned char只能保证在子范围内unsigned int而不一定int?如果是这样,那是否意味着一个实现理论上可以有一个unsigned char不在a的子范围内的值int

oua*_*uah 8

实现是否允许将它们提升为unsigned int?

实现将促进(unsigned int如果不是所有)unsigned char值都可以表示int(如C99中的6.2.5p9所规定).请参阅下面的实施示例.

如果是这样,那是否意味着一个实现理论上可以有一个unsigned char值,它不在int的子范围内?

是的,例如:DSP cpu有CHAR_BIT16或32.

例如,对于TMS320C55X的TI C编译器:CHAR_BIT在16到UCHAR_MAX65535,UINT_MAX65535但INT_MAX32767.

http://focus.ti.com/lit/ug/spru281f/spru281f.pdf