本贴讨论了整数的计算机表示中题目1。虽然文档和视频中讲解了 0000B 为二进制,但是貌似并没有标注后缀为 H 的数是什么进制。
00001111B和(00001111)₂应该是相同的
对于常用进制的区分,通常可以用括号或者后加一个字母
例如
二进制用括号后加下角标2,八进制括号后加8
或后加一个字母的
后加
B(Binary)是二进制
H(Hex)是十六进制
D(Decimal)是十进制
O(Octor)是八进制,但是八进制其实不太常见。。。有的文档将在Unix和Linux里仍有使用。
在部分编程语言中进制互转时有时会把to简写成2,比如二进制转十六进制会有 bin2hex(binary data)
另外,有关进制之间相互转换,这里给出几种常用的方法。
取商留余
对于某个十进制下的数字x,欲转换为二进制,我们对其进行做连续的除法,每次的商作为下一次的被除数,余数倒序排列,直到最后的商为0,既被除数小于2。余数倒序排列
计算1348的8进制为02504(按照题目里的表达形式应该是 02504O )。
将非十进制下数字转换为十进制,可以通过下述方法进行,以二进制距离。
对于二进制数 110B ,转换为十进制,
14+12+0*1=6,其中的4是二的二次方,2是二的一次方,1是二的零次方。其余进制同理,几进制就是几的n次方。
从倒数第一位乘x的0次方,倒数第二位乘x的1次方,倒数第三位乘x的2次方,x是当前进制,二进制数转换十进制就x=2,十六进制转十进制x=16.
当然,十六进制/八进制转换二进制是有简便方法的:
将十六进制/十进制/八进制的每一位都单独拿出,设为x,对于x我们取其二进制数,然后把他们的每一位按照原顺序拼接起来,就得到了他的二进制数。
例如:61D(61的十进制表达,就是真·61)就可以变成 (0110)(0001),那么61的二进制就是01100001B。
不过,每一位数字在转换后,如果不满4位二进制数,就要用0在前面补全,八进制则是补满3位。
至于为什么...就让各位同学在以后的学习中自行探索啦~
有关原码、反码、补码:
下文均建立在四位有符合位二进制数字(整数)下,由于位数限制,有些例子在自己测试时可能会出问题。因此,自己计算时推荐使用八位或以上的int进行计算。
原码:既一个数字的最基本二进制形式,正数的最高位为0,负数的最高位为1。
反码:一个正数的反码等于其自身,一个负数的反码等于其处符号位全部取反的结果。
补码:负数的补码等于他的原码自低位向高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。或者:负数的补码等于它的反码+1。但是事实上,这两句话都不是补码的定义,只是补码的一个计算方式而已~比较谁会突然灵感一现就写出一个反码+1呢~有兴趣的同学可以看一看《计算机组成原理》,里面用模和同余的方式解释了补码。
对于1+1=2来说,1 + 1 = 0001 + 0001 = 0010 = 2,是正确的。+0 + (-0) = 0000 + 1000 = 1000 = -0 ,嗯...也算是对吧
1-1 = 0001 + 1001 = 1010 = -2。啊?怎么成-2了,这不逗人玩吗。看来直接用原码计算不太靠谱。一个数加上他的相反数怎么不是0呢?
那我们用反码试试,
1-1= 0001 + 1110 = 1111 = -0(这里是-0的反码),差不多吧,好像对了。试试别的:-1-2=1110+1101=1011=-4夺少?怎么-1-2=-4了?emm,不过从原码上看1011好像是-3啊?巧合吗?这个时候,就应该使用伟大的实验是检验真理的唯一标准,来个-1-3=1110+1100=1010夺少?又成-5了??好吧,看来反码也不能完美处理这个问题。
但是也没有一种可能,我们把两个负数给他变成其绝对值相加,再强行给他按上一个负号,是不是也可以?貌似是的,但是未免有点麻烦了。
这个时候,我们就要搬出我们的补码了,请坐和放宽。
-1-2=1111+1110=11101不过我们因为用的四位,要取后面四位数字,得到1101,正好是-3的补码,这样看起来就对了。
我们来看一看其中的问题:
原码解决了正数的加法,但是其他各种运算全部都出问题了。
反码解决了正数与负数的加法,两个负数的加法虽然可以在不溢出符号位的时候强行用绝对值计算在给符号位置1,但是总感觉不太爽。而且你还有个-0存在,这让我很不爽,我的-8出现不了,只能变成-0,最小是-7最大却是8,很难受。
补码就很nice,正数的补码是其原码,两个正数相加相当于用了原码,正负相加和负负相加也是满足的,这就提高了程序的鲁棒性。
比如:2-4的补码是0010 + 1100 = 1110 -> 1101 -> 1010 = -2!
评论3
jlnokllyid
想想你的文章写的特别好
dsqqrttsll
怎么收藏这篇文章?
mahiibeggi
怎么收藏这篇文章?