为什么比较signed char和unsigned int不能正常工作?

我写了这一小段代码来测试一些:为什么比较signed char和unsigned int" title="unsigned int">unsigned int不能正常工作?

#include <stdio.h> 

int main()

{

unsigned x = 1;

signed char y = -1 ;

if (x>y)

printf("X > Y");

else

printf("X <= Y");

return 0;

}

我得到的输出是“X < = Y”。不是1> -1?

回答:

我们:

unsigned x = 1; 

signed char y = -1;

这个表达式:

x > y 

用作if语句的控制表达式。

经过通常的算术转换后,右操作数y将转换为unsigned int值。负值signed char-1的转换结果将是一个巨大的值unsigned int(等于UINT_MAX)。

1U > UINT_MAX 

这始终是假(即,评价为0):

所以表达式x > y将作为进行评价。

这是简短的版本。为了解释我们如何用C标准规则得出这个结果,我在下面解释它。

这是怎么一回事呢:

>关系运算符时,这里是C对关系运算符说:

关系运算符(C99,6.5.8p3) “如果两个操作数都有算术类型,则执行通常的算术转换。”

好的,在我们的例子中,两个操作数都是整数类型,整数类型是算术类型。所以通常的算术转换会完成。通常的算术转换是什么? 。

通常的算术转换(C99,6.3.1.8p1)“,否则,整数优惠是在两个操作数执行然后以下规则被施加到推动操作数:`

确定,第一个整数促销是对每个操作数,如何整数宣传执行?

整数促销(C99,6.3.1.1p2)“如果int可以代表所有VA原始类型的值,值被转换为int;否则,它被转换为一个unsigned int。这些被称为整数促销。“

ysigned char型的,它首先被提升为int整数促销后xunsigned int类型,并保持一个unsigned int

然后常见的算术转换会发现两个操作数之间的常见类型。在我们的例子中,它的意思是:

常见的算术转换(套)(C99,6.3.1.8p1)“,否则,无论是操作数转换为对应于与符号整型操作数的类型的无符号整数类型。”

unsigned int具有相同的转换秩为int类型(记住signed char晋升为int),所以促进了y将从int转换(以后推广)至unsigned int。有关信息,整数变换行列在(C99,6.3.1.1p1)中所定义。 正如你可以注意到的,unsigned int在通常的算术转换中赢得了int,另一种说法是说unsigned粘性

现在是如何的-1int值(其推广到intsigned char-1)转换为unsigned int价值?`。下面是C对整型转换说,在这种具体情况下:

整数转换(C99,6.3.1.3p2)“,否则,如果新类型是无符号的,则该值是通过重复地相加或相减转换的一个比可以在新的类型来表示,直到该值是在新的类型的范围内的最大值更“。

本段的写法使得它的含义与签名的数字表示无关。对于二的补码表示,这意味着int-1转换为(UINT_MAX + 1) - 1,其等于UINT_MAX。因此,在我们的具体情况,

x > y 

相当于

1U > UINT_MAX 

相当于

0 

回答:

如果你比较不属于同一类型的变量,其中一人有比较完成之前被强制成其他的类型。

“较短”类型将被提升为“较长”类型。

在这种情况下,signed char y将被转换为值为UINT_MAXunsigned int

具体地,假设使用32位ints一个编译器:

signed char   -1 = 0xff  becomes 

-> signed int -1 = 0xffffffff becomes

-> unsigned int 0xffffffff = UINT_MAX

x < y因此。

回答:

是不是1> -1?

这是,除非你使用unsigned值。在unsigned的世界中,最小值是零和1。其他所有内容都较大,并且该语言明确指出unsigned(-1)最大的无符号值。

以上是 为什么比较signed char和unsigned int不能正常工作? 的全部内容, 来源链接: utcz.com/qa/257153.html

回到顶部