unsigned char总是被提升为int吗?

时间:2013-07-26 13:16:20

标签: c type-conversion c99 integer-promotion type-promotion

假设以下内容:

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

unsigned int shmoo = foo + bar;

foobar值是否可以保证提升为int值,以便对表达式foo + bar进行评估 - 或者允许实现将它们提升为{{} 1}}?

第6.2.5节第8段:

  

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

第6.2.5节第9段:

  

如果 unsigned int 可以代表原始类型的所有值,则该值会转换为 int ;否则,它会转换为 int

保证整数类型具有较小整数转换等级的整数类型的值范围是另一种类型的值的子范围,这似乎取决于整数类型的 signedness

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

这是否意味着unsigned int的价值仅保证在unsigned char的子范围内,而不一定是unsigned int?如果是这样,这是否意味着理论上实现的int值不在unsigned char的子范围内?

2 个答案:

答案 0 :(得分:8)

  

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

如果并非所有unsigned int值都可以在unsigned char中表示(如C99中6.2.5p9所规定的那样),则实施将提升为int。请参阅下面的实施示例。

  

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

是的,例如:带有CHAR_BIT 16或32的DSP cpu。

例如,TMS320C55x的TI C编译器:CHAR_BIT为16且UCHAR_MAX 65535,UINT_MAX 65535但INT_MAX 32767。

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

答案 1 :(得分:0)

昨天我遇到了这个问题 - 希望我的答案是关于主题的。

uint8_t x =  10;
uint8_t y = 250;

if (x - y > 0) {
    // never happens
}

if (x - y < 0U) {
    // always happens
}

至少在我看来,它看起来好像是值x和y被意外地提升了,而实际上是他们的结果被提升了。