返回

数据在内存中的存储(入门到进阶)!!!

发布时间:2023-08-19 09:07:35 254

前言

好的大家好,今天给大家来讲解数据在内存中是如何进行存储的,本章分为两个部分,第一个部分是带大家认识原码,反码,补码的概念,第二部分就是有无符号数在内存中的取值范围如何判断,在此期间还会插入两道经典的题型和大家一起进行解答,下面开始。

正文

第一部分

原码

==原码其实就是将一个整数转化为二进制的形式==

比如我们的int a=10,那么我的原码就是 0000 0000 0000 0000 0000 0000 0000 1010--原码 当我们的int a=-10,那么我们的原码就是 1000 0000 0000 0000 0000 0000 0000 1010--原码

大家可以看到区别,这两个数的第一个二进制为一个为0,一个为1,那是因为,在有符号二进制中,二进制的第一个数中,0为正,1为负,所以大家可以看到-10的二进制第一位是1。

二进制的转换是这样进行的: 具体可以看《明解C语言入门篇》 image.png

反码

int a=10的反码是 0000 0000 0000 0000 0000 0000 0000 1010--反码 当int a=-10,他的反码是 1111 1111 1111 1111 1111 1111 1111 0101--反码

在二进制中,正整数的原码,反码,补码都是一样的,所以就是为什么上面int a=10的反码和原码一样,反码的意思就是,符号位不变其他位按位取反, image.png

补码

int a=10的补码 0000 0000 0000 0000 0000 0000 0000 1010--补码 int a=-10的补码 1111 1111 1111 1111 1111 1111 1111 0110--补码

image.png 可以认为,补码是在反码的基础上打了一个补丁,进行了一下修正,所以叫“补码”。

原码、反码、补码的概念只对负数有实际意义,对于正数,原码、反码、补码都是一样的。

所以我们就可以理解为: image.png

下面我们做一道题 image.png 这道题,大家可能会说,这个也太简单了,一点技术含量没有,大家先不要急,先带大家认识一下二进制在编译器中是怎么计算的: image.png 这个就是我们计算机进行二进制算法的过程,都改变成补码,这样只需要相加就行,不需要进行加法以外的任何操作,

由于整数在内存中是以补码表示的,那么计算机只要设计一种简单的、不用区分符号位和数值位的加法电路,就能同时实现加法和减法运算,并且非常高效,极大简化了计算机的硬件电路。

第二部分

有无符号数在内存中的取值范围如何判断 先带大家认识一下两个英文

unsigned (无符号数) signed (有符号数)

我们拿int举例, unsigned int signed int int 这三个类型中 signed int 和int 的类型是一样的都是有符号数,所以我们可以认为 signed可以省略。 给大家看一道题,大家可以思考一下。 image.png! 好的,大家看完这道题的答案会是什么呢,-128,还是128,或者是别的,那么接下来我带大家一起解答一下

这里是char类型的原码,反码,补码

image.png image.png 接下来我们就可以计算,他的原码变成十进制数的值是多少, image.png 我们再看计算机的运行 image.png 一模一样,那么大家可能会问,什么是整形提升,给大家解释一下: image.png

大概意思就是

假如我是一个char类型的数,我想要去打印%d或者是%u类型的,因为%d和%u都是整形,所以我需要将我的8个bit位的二进制数提升到32bit位,给大家画图表现一下

image.png

大家可以看到蓝色框框里面的那个,那个数就是我们要进行整形提升的符号位,因为我们的第一个符号位是0,所以后面直接用0补齐到32个bit位,

另外给大家看一下符号位是1二进制数整形提升什么样子 image.png 这两个图都是有符号数进行整形提升的,接下来给大家看无符号数如何进行整形提升 image.png image.png 这个就是整形提升,但是大家可能就会问了,咦?你之前那道题的整形提升为什么明明是%u为什么不补0,补的是1,我给大家同一解释一下,因为我们是打印的%u但是我们的char类型是有符号数,所以我们的整形提升是根据类型,也就是,如果我们是unsigned char那么我们整形提升就是其余位都补0,image.png 最后输出的是这个,但是我们上面的题,它的char类型是有符号数,所以整形提升就是根据最左边的第一个数进行判断,如果是1那就补充1,如果是0,那就补0,直到补齐32个bit位,

结束

好了,这篇就是数据内存的初阶,后续会根据时间去编写进阶,并且会在进阶里面进行好多道经典题的讲解,谢谢观看!!!

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
【C语言_2】整型和浮点型数据类型 2023-08-19 06:15:15