2015-09-30 134 views
2

为什么下面的程序给出的输出结果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(); 
} 
+0

你能澄清你的问题?你为什么不期望12> -2? – michaelrccurtis

+0

恩,数学同意你的结果。 –

+0

查看[常规算术转换](http://www.tutorialspoint.com/cprogramming/c_type_casting.htm) – Missu

回答

1

首先,引述C11标准关系运算符,章6.5.8

如果两个操作数有算术类型,通常的算术转换是执行 。现在

,按照章节6.3.1.8的描述,常见的算术转换,如果你尝试将signedunsigned整数(类型)之间进行运算时,signed人会得到提升到unsigned类型(排名较高),然后进行手术。

所以,在这里,为比较,b值越来越转换为unsigned类型,你得到错误输出那里。

引述的有关部分,从同一章

[...]。否则,两个操作数被转换为对应于与符号整型操作数的类型的无符号整数类型 。

您还可以检查正常的算术提升规则here

也就是说,void main()int main(int argc, char* argv[]),或者,至少,int main(void)

+0

比较不是算术运算。 – Psytho

+0

@ Alex.S'如果两个操作数都具有算术类型,则通常的算术转换是 执行.' –

+0

@ Alex.S如何比较而不是算术操作? – chux

0

它的类型提升规则:如果一个参数是int,另一个是unsigned int那么int被提升到unsigned int,添加必要的UINT_MAX + 1。

这发生在比较之前。

0
if(a>b) 

在这种aunsigned intbsigned int,所以由于隐式转换,b将被转换为unsigned int typeb将具有大的值(没有必要说,这将是比a更大)。

因此,你会得到意想不到的结果。

根据C99- 6.3.1.8通常的算术转换

[...]

3。否则,如果具有无符号整数类型的操作数的级别大于或等于另一操作数的类型的级别,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。

0

要执行比较,两个操作数首先转换为相同的类型。在这种情况下,int b被转换为更高的排名unsigned。对于比较值,则是12 > (-2 + (UINTMAX + 1))?这是错误的。

要在平时的数学意义上的比较:

unsigned int a; 
int b; 

if ((b < 0) || (a > b)) printf("a is greater"); 
相关问题