这道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了。