前言
本篇文章重点理解数据在内存中是如何存储的,内容较为抽象,希望大家多理解记忆。
整形数据在内存中的储存
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,就是大端存储。
结果和我们设想的一致。
总结
这个系列的文章比较难理解,希望我们都能多用自己的思维去理解记忆,这样会好理解一些。
本篇文章内容结束,感谢大家观看。如果意见或建议,可以在评论区留言,您的点赞是我更新的动力。我们下篇文章再见。