计算机中的整数存储和进制转换

前言:

在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码)。而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。ASCII 码一共规定了128个字符(0000 0000-0111 1111)的编码(8位),比如空格SPACE是32(二进制0010 0000),大写的字母A是65(二进制0100 0001 )。这128个符号(包括32个不能打印出来的控制符号)(2的7次方等于128个数),只占用了一个字节的后面7位(低7位),最前面的一位(高1位)统一规定为0(不要和数字的符号位搞混)。当然除了ASCII码,还有UTF-8、GBK等。

计算机编码方式:

计算机的编码方式有两种:无符号编码和补码编码。无符号数采用的是前者编码方式,有符号数采用的是后者编码方式。有符号数和无符号数的本质区别也在于采用的编码方式不同。

无符号编码:

每一种整数类型都可以加unsigned关键字,来表示一个无符号数,即没有正负之分。
1.范围:0 ~ 2^n-1(n位存储空间)举例,若是8位二进制数,无符号编码的最小值为0,最大值为255。
2.步骤:
(1)将整数变为二进制数
(2)如果二进制数不够n位,那就在左边加0凑足n位;如果超过n位则溢出
3.溢出:
例:有4位内存,最多存储到15,如果我们想再加5,得到结果是20,20=(10100)2,丢掉溢出位1,只剩(0100)2=4,所以溢出后得到的结果是4
4.应用:
(1)计数:计数是不需要负数的
(2)寻址:存储单元地址都是从0到整个存储器的总字节数
(3)排序:为文本、图像、音频、视频类数据类型排序

补码编码:

无符号编码符合人的惯性思维是没错,但是可惜的是,它无法表示负整数。因此我们需要一种能够表示负数的整数表示方式,这就是补码编码。
1.范围: ~~ (n位存储空间)举例,若是8位二进制数,补码格式的最小值为-128,最大值为127。
2.一些基本概念:
正数:最高位(符号位)为0
负数:最高位(符号位)为1
原码:就是符号加绝对值
反码:正数的反码就是原码,负数的反码是符号位不变,其他位取反
补码:正数的补码就是原码,负数的补码有两种计算方式,一是反码+1,二是原码从右往左找第一个1,1的右边(包含1)不变,1的左边全部取反(不包括符号位)
也就是说正数原码=反码=补码、负数补码=反码+1
注意:二进制补码表示法只有一个0,也就是(0000)2,-0统一表示成2n-1,也就是(1000)2= -8。【当二进制数位数是4位时】
3.存储步骤:
如何以补码存储整数
(1)将整数变为带符号二进制数
(2)如果是正数或0,保持不变;如果是负数,取其补码存储
4.还原步骤:
如何从补码还原整数
(1)如果是正数或0,保持不变;如果是负数,取其补码
(2)将该整数化为十进制或其他进制
5.溢出


二进制补码的溢出也分正溢和负溢,正溢和上面无符号溢出相同,因为正数不用变码,所以可以用直接相加的结果转换为二进制然后去掉溢出位。负溢的话不能用相减的十进制数直接转,因为负数需要变码,正确的计算溢出结果应该是转换成二进制,然后用二进制相减,比如-3-7=(1101)2-(0111)2=(0110)2=+6,当然这时候你可以使用-3+(-7)=(1101)2+(1001)2=(0110)2=+6的做法,因为这是一个正负对称的表达方式。
6.应用
二进制补码是计算机用于存储整数的标准表示法。

【注:对于n位二进制数,不管是有符号数还是无符号数,都是可存储2的n次方个数;但是可达的最大数值有区别:

无符号数(无符号编码)可达十进制最大值2^n-1; 最小值为0

有符号数(补码编码)可达十进制最大值2^(n-1)-1;最小值为2^(n-1)】

进制转换:

(针对整数十进制大小不超过2^64的小整数,即二进制位数不超过计算机能处理的最长整数longlong的64位。)

二进制数转八进制:从右往左,取3位二进制,按权展开,相加即可,最左边不能凑满3位则左补零。(三合一)
二进制转十进制:从右往左,按权展开,相加即可。(权值为2)
二进制数转十六进制:从右往左,取4位二进制,按权展开,相加即可,最左边不能凑满4位则左补零。(四合一)

八进制转二进制:从右往左,将每一位八进制数单独转为3位二进制数,再将结果连起来即可。(一分三)
八进制转十进制:从右往左,按权展开,相加即可。(权值为8)
八进制转十六进制:间接法,先将八进制转成十进制或二进制,然后再转成十六进制。

十进制转二进制:短除法,存储除出来的余数(最后一个小于除数的被除数为余数,然后结束短除法),逆序输出。(最先除出来的余数是最低位)
十进制转八进制:短除法,同上。
十进制转十六进制:短除法,同上。

十六进制转二进制:从右往左,将每一位十六进制数单独转为4位二进制数,再将结果连起来即可。(一分四)
十六进制转八进制:间接法,先将十六进制转成十进制或二进制,然后再转成八进制。
十六进制转十进制:从右往左,按权展开,相加即可。(权值为16)

*利用C语言中printf()函数的 输出控制符(格式字符) 输出对应进制数据:

程序中虽然写的是 i=123,但是在内存中并不是将 123这个十进制数存放进去,而是将 123的二进制代码存放进去了。

计算机只能执行二进制 0、1 代码,而 0、1 代码本身并没有什么实际的含义,它可以表示任何类型的数据。所以输出的时候要强调是以哪种进制形式输出。所以就必须要有“输出控制符”,以告诉操作系统应该怎样解读二进制数据。

要是%o就是以八进制的形式输出。如果是%x就是以十六进制的形式输出,小写的x,输出的字母就是小写的;如果是大写的X,输出的字母就是大写的;如果加一个#,就以标准的十六进制形式输出。最好是加一个#,否则如果输出的十六进制数正好没有字母的话会误认为是一个十进制数。大写是绝对标准的十六进制写法。

本博客在持续完善更新中..........(关于大整数进制转换的学习笔记在酝酿中)..........

参考博客:

计算机如何储存数字和字符:
https://ddnd.cn/2019/02/16/byte-hex-ascii/#more

计算机存储数字:(本博客的第一章图片来自这篇博客,截图后粘过来发现印上了自己的ID水印,在此表示惊奇和抱歉。)
https://blog.csdn.net/fenger3790/article/details/82759053

十进制负数转换为二进制,八进制,十六进制的知识分享:

https://www.cnblogs.com/wxb20/p/6033458.html

printf用法大全,C语言printf格式控制符一览表(好文章)
http://c.biancheng.net/view/159.html

格式字符(百度百科)
https://baike.baidu.com/item/%E6%A0%BC%E5%BC%8F%E5%AD%97%E7%AC%A6/1460342

猜你喜欢

转载自blog.csdn.net/Ideaddxxpp/article/details/90172536
今日推荐