将无符号整数变量转换为有符号变量

时间:2015-09-30 13:09:50

标签: c unsigned signed

为什么以下程序会给出 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();
}

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

它是类型促销规则之一:如果一个参数是int而另一个参数是unsigned int,则int会提升为unsigned int ,如有必要,添加UINT_MAX + 1。

这在比较之前发生。

答案 2 :(得分:0)

 if(a>b)

a unsigned int bsigned int bunsigned int type,因此,由于隐式转换,b将转换为afunction myRnd(prev, max) { return prev + Math.floor(Math.random() * max) + 1; } var last; last = myRnd(1000, 500); last = myRnd(last, 500); 将具有较大的价值(无需说,它将大于function myRndFunc(baseValue) { return function(max) { baseValue += Math.floor(Math.random() * max) + 1; return baseValue; }; } var myRnd = myRndFunc(1000); myRnd(300); myRnd(500); )。

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

  

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

     

[...]

     

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

答案 3 :(得分:0)

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

按照通常的数学意义进行比较:

unsigned int a;
int b;

if ((b < 0) || (a > b)) printf("a is greater");