43
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

我认为输出会 y 更大,因为它是无符号的。这背后的原因是什么?

4

6 回答 6

46

因为int值被提升为unsigned int. 特别0xFFFFFFFC是在一个 32 位机器上,它作为一个unsigned int429496729210

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

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

否则,如果有符号整数类型的操作数的类型可以表示无符号整数类型的操作数的所有值,则将无符号整数类型的操作数转换为有符号整数类型的操作数的类型。

这告诉我intvs.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;
}

输出

x>y
x<z

看看那个。

于 2012-11-28T08:58:07.743 回答
12

有符号和无符号值之间的比较将在“无符号空间”中进行。即,有符号值将通过添加转换为无符号值UINT_MAX + 1。在对负值使用 2-补码的实现中,不需要在后台对值进行特殊处理。

在这个例子中,-4变成了0x100000000-4=0xFFFFFFFC这显然是> 10

于 2012-11-28T08:44:22.077 回答
4

当您在 C 中比较两个值时,它们都必须属于同一类型。在这种情况下 (intunsigned int),int值将被转换为unsigned int第一个。

其次,C 中的无符号整数运算是以该类型的最大值 + 1 为模完成的(也就是说,它“循环”,UINT_MAX + 1反之亦然0)。因此,将负值转换为无符号会导致非常大的数字。

标准中的相关部分说:

6.3.1.3 有符号和无符号整数

2
否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上反复加减一,直到该值在新类型的范围内。

于 2012-11-28T08:47:06.200 回答
4

当您比较 anint和 an时unsigned intint将转换为unsigned int. anint到 an的转换unsigned int是通过添加来完成的UINT_MAX+1(注意你int是负数)。所以实际上你在比较:

if (-3 + UINT_MAX > 10)  //Since -4 is converted to UINT_MAX+1-4

这是真的。

于 2012-11-28T08:54:37.847 回答
1

int 值的第一位用于定义它是正数还是负数。(1 = 负数,0 正数)在比较之前,您的两个变量都被转换为 unsigned int,其中第一位中的 1 将被解释为您的数字的一部分。

这段代码应该可以正常工作:

int main(void) 

 { 

    unsigned int y = 10; 
    int x = – 4; 
    if (x > (int) y) 
    Printf("x is greater");
    else 
    Printf ("y is greater"); 
    getch ( ); 
    return (0); 

 } 
于 2012-11-28T08:47:36.593 回答
-2

int x=-4(4 的 2 的补码是 1111 1100 =252)并且 unsigned int y=10 是(0000 1010 =10)所以 252 >10 所以 -4 大于 10。

于 2012-11-28T08:54:05.007 回答