为什么下面的程序给出的输出结果b大于a? 即使b包含-2。将无符号整数变量转换为带符号变量
void main()
{
unsigned int a=12;
int b=-2;
if(a>b)
printf("a is greater");
else
printf("b is greater");
getch();
}
为什么下面的程序给出的输出结果b大于a? 即使b包含-2。将无符号整数变量转换为带符号变量
void main()
{
unsigned int a=12;
int b=-2;
if(a>b)
printf("a is greater");
else
printf("b is greater");
getch();
}
首先,引述C11
标准关系运算符,章6.5.8
如果两个操作数有算术类型,通常的算术转换是执行 。现在
,按照章节6.3.1.8的描述,常见的算术转换,如果你尝试将signed
和unsigned
整数(类型)之间进行运算时,signed
人会得到提升到unsigned
类型(排名较高),然后进行手术。
所以,在这里,为比较,b
值越来越转换为unsigned
类型,你得到错误输出那里。
引述的有关部分,从同一章
[...]。否则,两个操作数被转换为对应于与符号整型操作数的类型的无符号整数类型 。
您还可以检查正常的算术提升规则here
也就是说,void main()
应int main(int argc, char* argv[])
,或者,至少,int main(void)
。
它的类型提升规则:如果一个参数是int
,另一个是unsigned int
那么int
被提升到unsigned int
,添加必要的UINT_MAX + 1。
这发生在比较之前。
if(a>b)
在这种a
是unsigned int
和b
是signed int
,所以由于隐式转换,b
将被转换为unsigned int type
和b
将具有大的值(没有必要说,这将是比a
更大)。
因此,你会得到意想不到的结果。
根据C99- 6.3.1.8通常的算术转换
[...]
3。否则,如果具有无符号整数类型的操作数的级别大于或等于另一操作数的类型的级别,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。
要执行比较,两个操作数首先转换为相同的类型。在这种情况下,int b
被转换为更高的排名unsigned
。对于比较值,则是12 > (-2 + (UINTMAX + 1))
?这是错误的。
要在平时的数学意义上的比较:
unsigned int a;
int b;
if ((b < 0) || (a > b)) printf("a is greater");
你能澄清你的问题?你为什么不期望12> -2? – michaelrccurtis
恩,数学同意你的结果。 –
查看[常规算术转换](http://www.tutorialspoint.com/cprogramming/c_type_casting.htm) – Missu