深度理解C语言一——整型数据在内存中的储存


前言

本篇文章重点理解数据在内存中是如何存储的,内容较为抽象,希望大家多理解记忆。

整形数据在内存中的储存

1.原码,反码,补码的介绍

原码反码和补码是一种计算机中对数字的二进制的表示方法
原码:直接将二进制按照正负数的形式翻译成二进制就可以。
反码:将原码的符号位不变,其他位依次按位取反就可以得到了。(负数)
补码:反码+1就得到补码。(负数)
正数的原、反、补码都相同。
对于整形来说:数据存放内存中其实存放的是补码。

2.以char为例理解signed(有符号数)和unsigned(无符号数)

这个有符号数和无符号数其实按字面意思理解就行了,
重点理解一下,无符号数不认识符号位,无符号数不认识符号位。这句话的是什么意思呢?
这里举一个例子。
在这里插入图片描述
这里我们定义了一个无符号变量a,给他赋值为-10,按理说都无符号数了,怎么能给它赋值成负数呢。这个想法是对的。我们来把这个数打印出来看看是不是我们想要的-10。
在这里插入图片描述
我们得到的却是246,没有得到-10。而且编译器也没有报错。这里就详细学习一下。

在这里插入图片描述
所以我们得出char数据的取值范围为-128到127,如果输入这个范围以外的数,也会被转换成这个范围内的数。
理解了上述图,我们就可以解释一下无符号数不认识符号位是什么意思了。

unsigned char a=-10;

二进制补码为:11110110****
我们知道开头的1为符号位,表示这个数是负数,如果符号位是0,表示这个数为正数。
但在如果是无符数,根本不认识符号位。无符号数把符号位也看做位权,计算数值的时候也要计算,比如开头这个1就会计算为2的7次方。

所以打印时的值的计算逻辑为:存-10存的是补码,而打印时打印是原码,但无符号数原码=补码,所以打印的值=2的七次方+2的六次方+2的五次方+2的四次方+2的二次方+2的一次方=246
在这里插入图片描述

3.大小端介绍

什么是大小端?大端就是大端存储,小端就是小端存储。
大端(存储):是指数据的低位存在内存的高地址中,而数据的高位,存在内存的低地址
中。
小端(存储):是指数据的低位存在内存的低地址中,而数据的高位,存在内存的高地
址中。
举例:
在这里插入图片描述
10的16进制为a,应为00 00 00 0a,但在内存中却是0a 00 00 00. 所以可以看出我们当前编译器采取的是小端存储。
如何用代码来证实是小端存储呢?
在这里插入图片描述
1的16进制为:
在这里插入图片描述
这是小端和大端存储的两种方式,我们可以用字符指针来访问一个字节(编译器可能会有警告,这个警告没关系),如果是1,就是小端存储,如果是0,就是大端存储。
在这里插入图片描述
结果和我们设想的一致。

总结

这个系列的文章比较难理解,希望我们都能多用自己的思维去理解记忆,这样会好理解一些。
本篇文章内容结束,感谢大家观看。如果意见或建议,可以在评论区留言,您的点赞是我更新的动力。我们下篇文章再见。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT牛爷爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值