为什么以下程序会给出 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 :(得分:1)
首先,引用关系运算符的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)
。
答案 1 :(得分:0)
它是类型促销规则之一:如果一个参数是int
而另一个参数是unsigned int
,则int
会提升为unsigned int
,如有必要,添加UINT_MAX + 1。
这在比较之前发生。
答案 2 :(得分:0)
if(a>b)
在a
unsigned int
b
和signed int
b
为unsigned int type
,因此,由于隐式转换,b
将转换为a
, function 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");