Sla*_*shr 41 c int unsigned signed
int main(void)
{
unsigned int y = 10;
int x = – 4;
if (x > y)
Printf("x is greater");
else
Printf("y is greater");
getch();
return (0);
}
Output: x is greater
Run Code Online (Sandbox Code Playgroud)
我认为输出y会更大,因为它是无符号的.这背后的原因是什么?
Who*_*aig 45
因为int价值被提升为unsigned int.具体地0xFFFFFFFC在32位机,它作为上unsigned int是4294967292比大得多10
C99 6.3.1.1-p2
如果int可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int; 否则,它将转换为unsigned int.这些被称为整数促销.整数促销不会更改所有其他类型.
要执行转换:
C99 6.3.1.3-p2
否则,如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.
这基本上意味着"添加UINT_MAX + 1"(无论如何我读它).
关于为什么促销是在unsigned int一边; 优先级:
C99 6.3.1.8-p1
...否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型.
否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型.
还告诉我,int对unsigned char应该按预期工作.
测试
int main()
{
int x = -4;
unsigned int y = 10;
unsigned char z = 10;
if (x > y)
printf("x>y\n");
else
printf("x<y\n");
if (x > z)
printf("x>z\n");
else
printf("x<z\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产量
x>y
x<z
Run Code Online (Sandbox Code Playgroud)
好吧,看看那个.
glg*_*lgl 11
有符号和无符号值之间的比较将在"无符号空格"中进行.即,签名值将通过添加转换为无符号UINT_MAX + 1.在使用负补偿的2补码的实现中,在引擎盖下不需要对值进行特殊处理.
在这个例子中,-4被变成0x100000000-4= 0xFFFFFFFC这显然> 10.