假设以下内容:
unsigned char foo = 3;
unsigned char bar = 5;
unsigned int shmoo = foo + bar;
foo
和bar
值是否可以保证提升为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
的子范围内?
答案 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。
答案 1 :(得分:0)
昨天我遇到了这个问题 - 希望我的答案是关于主题的。
uint8_t x = 10;
uint8_t y = 250;
if (x - y > 0) {
// never happens
}
if (x - y < 0U) {
// always happens
}
至少在我看来,它看起来好像是值x和y被意外地提升了,而实际上是他们的结果被提升了。