品牌型网站建设哪里好,空间站 对接,镇江市扬中市做网站,域名直卖网计算机很多术语翻译成中文之后#xff0c;不知道是译者出于什么目的#xff0c;往往将其翻译成一个很难懂的名词。
奇怪的数学定义 下面是关于原码的“吐槽”#xff0c;可以当作扩展。你可以不看#xff0c;直接去下一章#xff0c;没有任何影响。 原码的吐槽放在前面是…计算机很多术语翻译成中文之后不知道是译者出于什么目的往往将其翻译成一个很难懂的名词。
奇怪的数学定义 下面是关于原码的“吐槽”可以当作扩展。你可以不看直接去下一章没有任何影响。 原码的吐槽放在前面是防止读者看完原码然后看半天才看到补码影响阅读体验。 某些书描述“原码”的时候很“奇怪”你可能在某些书上见到过下面这样很难理解的描述下图截自原码 - 维基百科
这玩意是数论里的等价类或者群论里的空间的表达方式也就是计算机里常出现的“模运算”。或者还有个更高级的名字散列因为很多散列算法就是模运算然后用的等价类的思想。 等价类3 mod 2和1 mod 2的结果都为1所以都等于[1]也就是3和1都是关系mod 2的1等价类。 那上面的那一堆是什么意思呢
以整数原码为例X是一个数范围不定。
[1011]的意思是和1011等价的所有数 X m o d 2 n 1011 X mod 2^n 1011 Xmod2n1011
比如 n 4 n4 n4的时候 2 n 0 b 1111 2^n0b1111 2n0b1111 1011 m o d 2 n 1011 ( 2 n 1011 ) m o d 2 n 1011 1011 mod 2^n 1011\\ (2^n 1011) mod 2^n 1011 1011mod2n1011(2n1011)mod2n1011
而[-1011]的意思是和(2^{n-1} - 1011)等价的所有类 ( 2 n − 1 − X ) m o d 2 n 1011 (2^{n-1} - X) mod 2^n 1011 (2n−1−X)mod2n1011
比如是 8 位的数字 ( 2 8 − 1 − ( − 1011 ) ) m o d 2 n ( 10000000 1011 ) ) m o d 11111111 10001011 (2^{8-1} - (-1011)) mod 2^n \\ (10000000 1011)) mod 11111111 10001011 (28−1−(−1011))mod2n(100000001011))mod1111111110001011
这是教材不是论文而且一般论文也不用这么说吧
这种表达方式唯一的好处就是让你理解溢出之后该怎么处理因为取模运算的值就是溢出后得到的值。 说实话这种表达方式就不应该出现在任何现代教材中哪怕是很多数学分析的书都不会这样描述数的。我不知道这种用法最早出现在哪里但是欧美一些常见的计算机组成与设计教材中没有出现过这种用法也就是说并不是盲目学来的。 不论是“true code”还是“true form”都在英文搜索中难以找到。WiKi “有符号数处理”中“原码”对应的是“符号及值sign magnitude”英文版直接就是“Sign–magnitude”。这玩意的在一些教材中的翻译是“符号和幅值表达法”看看这个名字多清晰和直白。 这个方法读者理解就好没必要学后文也完全不使用这个方法怎么容易理解怎么来。但计算机科学确实有很多算法使用了等价类的概念所以如果你要走算法方向还是要看看的。
原码
原码就是我们常用的数在计算机中就是用二进制表示的十进制数不论正负、不论整数还是小数。
n位原码就是用最高位小端就是最右位当作符号位0为正数1为负数关于0对称范围内的数 − 2 n 2 n -2^n2^n −2n2n比如-44、-1616范围的两个端点关于0对称正负数的个数相同。
补码2’s complement
n位补码就是用最高位小端就是最右位当作符号位0为正数1为负数关于0不对称范围内的数 − 2 n − 1 ( 2 n − 1 − 1 ) -2^{n-1}(2^{n-1}-1) −2n−1(2n−1−1)比如-1615范围的两个端点关于0不对称。
这里概念很容易和和其他码搞混比如原码。
但其实只用记住一个关键点补码的-1是1111而原码是1001。
换言之从零值的“生长”来说
原码相当于少一位最大的那位的无符号数。抛开符号位-x和x的表达是一样的所以上下限的绝对值是一样的。补码从0开始增减0b0000-1借位算出是0b1111。但是1增的时候要注意不能让最大位为1所以上限比下限绝对值少1。
补码是现在主流的格式所以各种考试也主要考补码。所以只讲一下补码的计算。
补码计算的时候加减法要带着符号位进行乘除法就是左移补0右移补符号位。
比如
1011*2得到的是0110。1011/2得到的是1101。00110011也就是3360110 0011
0011
-------01100011-0111也就是3-7-41100。 0011
-0111
-------1100用加减法可以很容易得到-x对应的二进制反之亦然。
举个例子我要计算出1111 0100的的十进制那么可以先计算出和00000 0000的差前 4 位相同甚至可以不用写 0000 0000
-1111 0100
-----------0000 1100得到12加上符号-原二进制符号位为1也就是负的那么最后得到-12。
反之我们想计算出-8的二进制也就是和0差80000 1000那么就可以 0000 0000
-0000 1000
-----------1111 1000是不是很简单。
反码1’s complement
反码中一个数的相反数就是按位取反1变00变1这也是名字的由来。
比如100000001按位取反得到-111111110。
所以反码和原码一样是关于0对称的所以正负数的个数相同。但是不同之处在于反码有两个0正00000和负01111。
在无符号数的反码中x按位取反为 2 n − 1 − x 2^n-1-x 2n−1−x。
因为无符号反码增长就是从0一直加所以最大值是 2 n − 1 2^n-1 2n−1。而按位取反就相当于从尾部往前倒。
你可以观察一下下面这个表格再看看我的说法你就会理解了。
反码1’s complement早期设备用的多现在用补码2’s complement是主流因为反码计算的时候更麻烦一些只是在计算一些科学计算的时候更有优势罢了。
看开头的数字也可以看出顺序来啊对这两个英文中的数字就是版本这你能想到哈哈哈哈。
移码Offset binary
移码又称“偏移表示法”这个方法现在是上面浮点数用的多比如 IEEE 754。
移码从0000开始递增依旧使用最高位位符号为只不过这里1表示正数 0表示负数。与前面的几种方法相反。
有符号移码最小的负数是0000最大的整数是11110是1000。
这里可能好奇名字中“偏移”的意思其实就是“给数加上一个偏移数后使其具有非负的表达形式”。
比如上面的0加上一个偏移1000得到的就是1000也就是0非负。
关于这部分浮点数中再细说吧。
希望能帮到有需要的人
参考资料
《Computer Organization and Design MIPS Edition: The Hardware/Software Interface Fifth Edition》如果你要学习计算机结构的话这本书要比国内的很多教材好但是翻译的确实不太行。
原码 - 维基百科
Signed number representations - 维基百科