目录:1.整数在内存中存储
2.大小端字节序及如何判断
百度笔试题
深入理解整数存储练习:四好题
第一题
第二题
第三题
第四题
1.整数在内存中的存储
整数在内存以二进制补码的方式储存:
对于正数,其原码反码和补码都相同
对与负数则三种表示方法各不相同。
这里就不多说了,详解:原码,补码,反码及操作符和位移操作符,位操作符-CSDN博客
2.大小端字节序及判断:
当我们了解整数在内存中的存储会发现一个小细节。为什么a中的数按照字节为单位倒着存储呢?
相信大家都听说过大小端,到底什么是大小端呢?
当一个数据超过一个字节的时候在内存中储存会有不同的储存顺序,就是大端字节序储存和小端字节序储存
大端字节序储存:低字节的内容储存在内存高地址,高字节内容储存在内存低地址。
小端字节序储存:低字节的内容储存在内存低地址,高字节内容储存在内存高地址。
为什么会有大小端之分?
在计算机系统中,以字节为单位每个地址单元对应着一个字节,一字节八个比特位,还有16比特位的short,32比特位的long对于大于8比特位的处理器,由于寄存器的宽度大于8字节,就必然存在如何将多字节安排的问题。就有了大端储存模式和小端储存模式。
例如一个32比特int型的x,x的值为0x11223344,44为低字节内容,11为高字节内容
在x64环境中排放顺序便是 44 33 22 11
那么如何判断大小端储存呢?
一道10分的百度笔试题
请简述⼤端字节序和⼩端字节序的概念,设计⼀个⼩程序来判断当前机器的字节序。
这里的概念就不说了 ,那么如何编写这个程序呢
思路:
定义一个值为1的变量,将其强制类型转换成char型,取到其低地址字节的内容,如果是小端储存,那么取到的是01,相反如果是大端储存那么取到高地址内容为00
代码如下
深入理解整数存储练习:四好题
第一题
练一:且看这题结果会是什么?三个 -1 ?这题需要整型提升哦~
思路:
当然,a和b的值应该是一样的,char 其实就是 signed char ,只不过可以省略。
那 c 呢 ?
char 类型占一个字节,八个比特。
-1 原码:10000000000000000000000000000001
补码:1111111111111111111111111111111111111
char 储存八个比特:
补码发生截断,11111111
又因为类型为unsigned char,但是%d打印的是十进制打印有符号整数,所以c要发生整型提升
将8比特补充为32位比特,全补充0
c:00000000000000000000000011111111
此时c为无符号整数,提升后二进制的就是c的值
所以c的值为255
第二题:
分析:char类型的储存值范围-128---127
-128的补码:1000000000000000000000001000000
char中储存的:100000000
%u十进制形式打印无符号整型
char为有符号整型,这里发生整型提升,变成无符号整型
提升后补码:11111111111111111111111110000000,
提升成无符号整型后,二进制的值就是a的值。
第三题:
真的是循环1000次吗!!!!
长度为1000???
仔细分析,strlen是求到‘\0’也就是0之前的长度。
注意:char类型储存范围:-128--127
什么时候a[i]=0?
i=0,a[0]=-1;
i=1,a[1]=-2;
...........
i=127,a[127]=-128
i=128,a[128]=127;
i=129,a[129]=126;
.......
i=128+127,a[128+127]=0;
为什么从a[127]=-128,突然到a[128]=127? 别急一张图搞定;
所以因该循环128+127次a【i】就等于0啦
第四题:
看到这里,你会人认为这里循环多少次?255次?
借助上题仔细考虑
先给你一张图:
看到这应该明白啦吧,上面其实是一个死循环,i为unsigned char类型,i的值永远小于等于255
答案: