unsigned char总是被提升为int吗?

假设如下:

unsigned char foo = 3; unsigned char bar = 5; unsigned int shmoo = foo + bar; 

是否保证将foobar值提升为用于表达式foo + bar的求值的int值 – 或者是否允许实现将它们提升为unsigned int

第6.2.5节第8段中:

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

第6.2.5节第9段中:

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

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

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

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

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

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

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

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

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

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

我昨天碰到了这个 – 希望我的回答是关于主题的。

 uint8_t x = 10; uint8_t y = 250; if (x - y > 0) { // never happens } if (x - y < 0U) { // always happens } 

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