下列C程序执行后c输出结果为( )(32位)
#include<stdio.h> #include<stdlib.h> void main() { int a = -3; unsigned int b = 2; long c = a + b; printf("%ld\n", c); }
答案:A.-1 计算机里面的代码是以二进制补码的形式存储的,在进行负数需要注意一下,正数的补码是它本身,负数的补码=取反+ 1;a = -3是有符号数,首先3的二进制表示为0000 0000 0000 0000 0000 0000 0000 0011 取反后:1111 1111 1111 1111 1111 1111 1111 1100 加1后:1111 1111 1111 1111 1111 1111 1111 1101 ;b = 2是无符号数:0000 0000 0000 0000 0000 0000 0000 0010 ;a + b 之后得到:1111 1111 1111 1111 1111 1111 1111 1111 即0xFFFFFFFF, 因为计算机存的是补码,所以显示出来要转化出来也是取反加一。最终答案:-1 有符号数和无符号数的区别: 有符号数和无符号数进行比较运算时候(==, <, > <=, >= )有符号数会转化成无符号数(即底层的补码不变,但是比较数从有符号变无符号数)