main() {
unsigned x = 1;
char y = -1;
if (x > y)
printf("x>y");
else
printf("x<=y");
}
我本以为会出现 x>y
的情况,
但是我不得不将 unsigned int
改为 signed int
才能得到预期的结果。
main() {
unsigned x = 1;
char y = -1;
if (x > y)
printf("x>y");
else
printf("x<=y");
}
我本以为会出现 x>y
的情况,
但是我不得不将 unsigned int
改为 signed int
才能得到预期的结果。
如果char
等同于signed char
:
char
被提升为int
(整数提升,ISO C99 §6.3.1.1 ¶2)int
和unsigned int
的等级相同,因此将int
转换为unsigned int
(算术转换,ISO C99 §6.3.1.8)如果char
等同于unsigned char
:
char
可以被提升为int
或unsigned int
之一:
int
可以表示所有的unsigned char
值(通常是因为sizeof(int) > sizeof(char)
),则将char
转换为int
。sizeof(char)==sizeof(int)
),将char
转换为unsigned
。int
或unsigned int
,另一个是unsigned int
。 将第一个操作数转换为unsigned int
。整数提升:
如果int
可以容纳原始类型的所有值,则将较低等级类型的表达式转换为int
,否则转换为unsigned int
。
算术转换: 尝试转换为更大的类型。 当有符号和无符号之间冲突时,如果较大(包括两种类型具有相同等级的情况)的类型是无符号的,则选择无符号类型。 否则,在它能表示两种类型的所有值的情况下只选择有符号类型。
转换为整数类型(ISO C99 §6.3.1.3):
将超出范围的值转换为无符号整数类型时,使用环绕方式(模运算)实现。
将超出范围的值转换为有符号整数类型是由实现定义的,并且可能会引发一个信号(如SIGFPE)。
在单个操作中使用有符号和无符号时,C语言的自动类型转换会将有符号类型提升为无符号类型。如果将 -1
的位模式视为无符号数,则它是一个非常非常大的值。因此,x > y
是错误的。
char
隐式提升为unsigned
取决于实现中char
的底层表示(例如二进制补码),这是不正确的。 - CB Bailey