8

假设如下:

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

unsigned int shmoo = foo + bar;

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

第 6.2.5 节第 8 段中:

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

第 6.2.5 节第 9 段中:

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

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

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

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

4

2 回答 2

8

是否允许实现将它们提升为无符号整数?

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

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

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

例如,用于 TMS320C55x 的 TI C 编译器:CHAR_BIT为 16 和UCHAR_MAX65535、65535UINT_MAX但为INT_MAX32767。

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

于 2013-07-26T13:22:32.110 回答
0

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

uint8_t x =  10;
uint8_t y = 250;

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

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

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

于 2015-10-24T10:58:35.477 回答