错题记录2:源码补码二进制转换

 补码原码二进制一直是本人比较头疼的问题,今日找题目来做发现还是错得多,记录以下,再回顾一遍。

1.如下代码输出的是什么( )

char a=101;
int sum=200;
a+=27;sum+=a;
printf("%d\n",sum);

A: 327

B: 99

C: 328

D: 72
 


答案:D

解析“:char作为一个字节的类型,它的二进制存储就是8个比特位也就是:0000 0000,这8个比特位的最高位是符号位,那么char能存储数据的范围就从2^8 =256(0-256)变成了了2^7=128(-128 - 127)

那么a = 101再加上一个27,就是128,128表示为1000 0000,作为补码放在内存中,符号位为1
在与int类型的sum进行加计算时会整型提升,高位补充当前符号位的值直到32位,也就是1,我们用计算器打出来看看

也就是现在内存里面存放的是-128,200-128=72,故答案选D。

总结一下:错的契机在于整型提升的时机和截断这一部分还是没有弄懂,存放在内存中的补码,打印出来的原码,这些都是不一样的,不要再次弄混。

2.对于下面代码执行后输出的是什么( )

int value = 1024;
char condition = *((char*)(&value));
if(condition) value += 1;
 condition = *((char*)(&value));

if(condition) value += 1; 
condition = *((char*)(&value));

printf("%d %d", value, condition);

A: 1026 1

B: 1025 0

C: 1025 1

D: 1024 0


正确答案:D

解析:这道题主要的难处就是在这个*((char*)(&value));上面,我们一个个来看。

首先是&value,取出value的地址,然后强制类型转换成char*类型,而char*类型的指针变量每一次只访问1个字节若数据是采用大端存储方式,则低地址对应的是数据的高位,即最左边的8位0,则condition=0,不执行两
个if语句,则value不变,还是1024;若数据是采用小端存储方式,则低地址对应的是数据的低位,即最右边的8位0,则condition=0,不执行两个if语句,value值还是1024


 

猜你喜欢

转载自blog.csdn.net/m0_53607711/article/details/128545664
今日推荐