这道C语言面试题要求写出下面代码的输出结果是什么,主要是关于无符号数与有符号数相加问题,付答案及详解。
#include <stdio.h>
//无符号数与有符号数相加
int main(int argc, char **argv)
{
unsigned int a = 6;
int b = -12;
if(a+b > 0)
{
printf("dsds\n");
printf("a+b=%d\n" , a+b);
printf("a+b=%p\n" , (void *)(a+b));
}
else
{
printf("ssss\n");
printf("a+b=%d\n" , a+b);
printf("a+b=%p\n" , (void *)(a+b));
}
return 0;
}
答案:
dsds
a+b=-6
a+b=0xFFFFFFFA
原因:当无符号数与有符号数相加时,将相加后的结果转化为无符号数,为什么第一个结果是-6呢,因为%d输出的时候是按照有符号数输出的。第二个输出语句就是按照内存里的内容输出的。为什么是0xFFFFFFFA,-6的补码就是0xFFFFFFFA,计算机在内存中存储数据的格式是补码的格式,所以打印出来的结果就是一个大于0的数。这就充分说明了a+b>0了。
