好题别走!整数数据怎么在内存中存储?这篇讲的透彻明白

目录: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

答案:



  • 34
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值