数据在内存中的存储(入门到进阶)!!!
前言
好的大家好,今天给大家来讲解数据在内存中是如何进行存储的,本章分为两个部分,第一个部分是带大家认识原码,反码,补码的概念,第二部分就是有无符号数在内存中的取值范围如何判断,在此期间还会插入两道经典的题型和大家一起进行解答,下面开始。
正文
第一部分
原码
==原码其实就是将一个整数转化为二进制的形式==
比如我们的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语言入门篇》
反码
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的反码和原码一样,反码的意思就是,符号位不变其他位按位取反,
补码
int a=10的补码 0000 0000 0000 0000 0000 0000 0000 1010--补码 int a=-10的补码 1111 1111 1111 1111 1111 1111 1111 0110--补码
可以认为,补码是在反码的基础上打了一个补丁,进行了一下修正,所以叫“补码”。
原码、反码、补码的概念只对负数有实际意义,对于正数,原码、反码、补码都是一样的。
所以我们就可以理解为:
下面我们做一道题 这道题,大家可能会说,这个也太简单了,一点技术含量没有,大家先不要急,先带大家认识一下二进制在编译器中是怎么计算的: 这个就是我们计算机进行二进制算法的过程,都改变成补码,这样只需要相加就行,不需要进行加法以外的任何操作,
由于整数在内存中是以补码表示的,那么计算机只要设计一种简单的、不用区分符号位和数值位的加法电路,就能同时实现加法和减法运算,并且非常高效,极大简化了计算机的硬件电路。
第二部分
有无符号数在内存中的取值范围如何判断 先带大家认识一下两个英文
unsigned (无符号数) signed (有符号数)
我们拿int举例, unsigned int signed int int 这三个类型中 signed int 和int 的类型是一样的都是有符号数,所以我们可以认为 signed可以省略。 给大家看一道题,大家可以思考一下。 ! 好的,大家看完这道题的答案会是什么呢,-128,还是128,或者是别的,那么接下来我带大家一起解答一下
这里是char类型的原码,反码,补码
接下来我们就可以计算,他的原码变成十进制数的值是多少, 我们再看计算机的运行 一模一样,那么大家可能会问,什么是整形提升,给大家解释一下:
大概意思就是
假如我是一个char类型的数,我想要去打印%d或者是%u类型的,因为%d和%u都是整形,所以我需要将我的8个bit位的二进制数提升到32bit位,给大家画图表现一下
大家可以看到蓝色框框里面的那个,那个数就是我们要进行整形提升的符号位,因为我们的第一个符号位是0,所以后面直接用0补齐到32个bit位,
另外给大家看一下符号位是1二进制数整形提升什么样子 这两个图都是有符号数进行整形提升的,接下来给大家看无符号数如何进行整形提升 这个就是整形提升,但是大家可能就会问了,咦?你之前那道题的整形提升为什么明明是%u为什么不补0,补的是1,我给大家同一解释一下,因为我们是打印的%u但是我们的char类型是有符号数,所以我们的整形提升是根据类型,也就是,如果我们是unsigned char那么我们整形提升就是其余位都补0, 最后输出的是这个,但是我们上面的题,它的char类型是有符号数,所以整形提升就是根据最左边的第一个数进行判断,如果是1那就补充1,如果是0,那就补0,直到补齐32个bit位,
结束
好了,这篇就是数据内存的初阶,后续会根据时间去编写进阶,并且会在进阶里面进行好多道经典题的讲解,谢谢观看!!!