#include <stdio.h>
#include <stdint.h>
int main()
{
uint16_t peter = 8;
uint32_t peter2 = 8;
if(peter > -1)
{
printf("Peter true\n"); //expected
}
if (peter2 > -1)
{
printf("Peter 2 true\n"); //wtf, why not
}
return 0;
}
为什么第一个语句进入子句而第二个语句没有进入子句(在 32 位架构上)?
对
peter > -1
和 peter2 > -1
之间差异的解释是“整数提升”以及“通常的算术转换”的概念。
“整数提升”意味着任何比
t
窄的整数类型 int
都会“提升”为 int
(如果 int
可以包含 t
的所有值)或 unsigned int
,否则。在您的示例和编译器中,升级应用于 peter
。
然后,通常的算术转换决定当算术二进制运算(此处为
>
)应用于不同类型的操作数时会发生什么。在相同宽度的无符号和有符号整数类型之间,这些规则规定有符号操作数在运算发生之前会转换为无符号。