目录
一.前言
各位读者在日常学习和工作中肯定对各种数据类型的变量是不陌生的了,但是不知道您有没有想过它们在计算机内部是如何保存的呢?今天就让我来为大家回答这一疑惑。
二.分类
整型的种类庞大,分为:
1.char型---unsigned char, signed char(注:由于字符本质上存储的是相应ASCII码值,是整数,因此把它归类为整型)
2.short型---unsigned short[int], signed short[int]
3.int型---unsigned int, signed int
4.long型---unsigned long[int], signed long[int]
5.long long型---unsigned long long[int], signed long long[int]
三.存储
(1)整型数据二进制的三种表示形式
分为原码,反码,补码(包括符号位<从二进制的左边开始第一个数字【0正1负】>和数值位)
正数的原码,反码,补码相同(符号位为0)。
负数则略有不同:
1.负数原码数值位与其相反数(正)相同,但符号位为1.
2.负数反码是通过数值位取反(0-->1 1-->0),符号位不变得到的。
3.负数补码是其反码加一所得。
重点:对于整型来说,数据放在内存中保存实质上是存储其补码!!!
(原因:在计算机系统中,补码可以将符号位和数值域统一处理;同时加法,减法也可以统一处理<1+1==1+(-1)>[cpu只有加法器没有减法器],此外,补码与原码相互转换,其运算过程是相同的,不需要额外硬件电路)
(2)整型数据的运算
其本质就是在计算机中将十进制转化位二进制后再相加,这里的二进制统一都是用补码。
正数就是正常的十进制转二进制再计算,而负数则需要将十进制转化为二进制之后得到的原码转化为补码再计算。
例如(6-2):
6转化为00000000000000000000000000000110(整型4个字节,32个比特位)
减二改为加(-2)
将-2转化为10000000000000000000000000000010
由于6就是原码=反码=补码,故不用再做变化
而-2需要将原码转化为补码
10000000000000000000000000000010(符号位除外,其余取反)得到:
111111111111111111111111111111111101(再加一)得到:
111111111111111111111111111111111110(补码)
然后将两者相加得到补码,转化为原码可得
00000000000000000000000000000100(即为4)
综上,可见计算机内部实现一个数据的运算还是比较复杂的。
(3)数据的存储
在一个程序中可以观察它的内存存储,例如
可以看到是16进制的表现形式,但计算机内部是以二进制进行存储的。
但是有一个奇怪的地方
为什么数据的较低位保存在内存的高地址呢?
因此我们引出了字节序大小端这个概念
(4)字节序大小端的介绍
首先,字节序是以字节为单位讨论存储顺序的。
大小端
大端(存储模式):数据的低位保存到内存的高地址中,数据的高位保存到内存的低地址中
小端(存储模式):数据的低位保存到内存的低地址中,数据的高位保存到内存的高地址中
在弄清顺序之前,我们得先知道为什么有大小端这一说法
计算机系统中内存是以字节为单位进行编址的,每个地址单元都唯一的对应着1个字节(8 bit)。这可以应对char类型数据的存储要求,因为char类型长度刚好是1个字节,但是有些类型的长度是超过1个字节的(字符串虽然是多字节的,但它本质是由一个个char类型组成的类似数组的结构而已),比如C/C++中,short类型一般是2个字节,int类型一般4个字节等。因此这里就存在着一个如何安排多个字节数据中各字节存放顺序的问题。正是因为不同的安排顺序导致了大端存储模式和小端存储模式的存在。(我们熟知的vs中x86结构就属于小端存储模式)
判断大小端的方法
i = 1的存储方式为01 00 00 00
if(*(char*)&i) ==1) 为小端
if(*(char*)&i) ==0) 为大端
四.结尾
学习计算机就得由浅入深,知其然还得知其所以然,了解计算机的内部运行方式是一名优秀的程序员所必不可少的技能,因此努力冲吧,未来的高薪程序员们(谢谢点赞加关注, 下期出浮点数在内存中的存储),拜拜。