数据在内存中的存储——习题理解(1)

1.大小端字节排序

什么是大小端字节排序?

首先我们在编译器中调试看一个现象

可以从内存窗口发现,在内存中存储a的方式与我们初始化的相反

可以发现本在最后一位也就是最低位的87反而在了前位(低位)地址,这就是小端字节排序。

小段字节排序:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。

大端字节排序:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。

2.习题理解

2.1 练习1

#include <stdio.h>
int main()
{
 char a= -1;
 signed char b=-1;
 unsigned char c=-1;
 printf("a=%d,b=%d,c=%d",a,b,c);
 return 0;
}

可以发现这里的输出都是以%d形式输出,但在初始化时都是以char类型设置的。

那么先上结果,看看自己有没有做对。

这里来逐步解析一下:

我这里使用的编译器是vs2020,这里的字节排序是小端排序,char类型的默认形式是signed也就是有符号类型。

我们知道数在内存中的储存形式是以2进制的补码存储的,那么我们先表示出-1的补码形式:

原码:10000000000000000000000000000001

反码:1111111111111111111111111111111111110

补码:1111111111111111111111111111111111111

a:

但是a的类型是char,即只能存储1byte(8bit),并且刚刚提到这里的排序方式是小端排序,所以这里就会从补码的后端发生截断。

a中存储的: 11111111

然后输出方式是以%d形式的,所以这里要进行整型升级

有符号型整型升级,以高位数字进行升级

升级后:1111111111111111111111111111111111111

再转换为原码:

10000000000000000000000000000001

得到结果 -1

b:

同a

c:

同a得到在c中存储的是:

11111111

不过在这里进行整型升级的时候与上边不同

因为c的类型是unsigned char 是无符号型,所以进行升级的时候直接在高位补0

升级后:00000000000000000000000011111111

得到结果 255

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值