#include<stdio.h>
void main()
{
int a = -1;
unsigned int b =15;
if(b==a)
printf ("b is equal to a");
}
输出为空。负整数存储为相同正数的2的补码。当一个整数与无符号整数比较时,整数被提升为无符号整数,将2的补码视为无符号整数,此处为15,但输出为空,尽管2的补码为-1是15
答案 0 :(得分:2)
变量a
和b
int a = -1; /* its a sign ed int, it takes 4 bytes */
unsigned int b =15;/* its a unsigned int */
它看起来像下面
a = -1 => 1111 1111 | 1111 1111 | 1111 1111 | 1111 1111
b = 15 => 0000 0000 | 0000 0000 | 0000 0000 | 0000 1111
MSB LSB
现在比较a
和b
之类的
if(b==a) {
/* some code */
}
您要在两种不同类型之间进行比较==
(a
属于signed
类型&amp; b
属于unsigned
类型。所以隐式编译器会将sign int
转换/推广到unsigned int
&amp;然后它将执行比较==
。有关算术对话规则,请参阅此http://port70.net/~nsz/c/c11/n1570.html#6.3.1.8。
现在等同于unsigned
或a
的{{1}}是多少?其全部-1
为4字节,即one's
。所以现在它看起来像
4294967295
由于if(15==4294967295) { /*its false */
/* some code */
}
条件为false,因此您的代码不会打印任何内容。
答案 1 :(得分:0)
如果您将变量b更改为
unsigned int b = 4294967295;
(这假设int存储为32位)
将运行print语句。请参阅https://stackoverflow.com/a/2084968/7529976