原码是怎么计算的?

原码的计算逻辑,本质是“用符号位标正负,用数值位记录绝对值的二进制”——这是它最核心的规则,所有计算都围绕这两点展开。

整数原码:符号位+数值位的二进制拼接

对于整数来说,原码的计算分两步:先定符号位,再转数值位。 符号位的规则很简单:正数用“0”,负数用“1”。数值位则是整数绝对值的二进制表示。比如要算+5的4位原码: 1. 符号位:+5是正数,填“0”; 2. 数值位:5的二进制是“101”; 3. 拼接起来就是“0101”——这就是+5的4位原码。

再比如-5的4位原码: 1. 符号位:-5是负数,填“1”; 2. 数值位:还是5的二进制“101”; 3. 拼接后是“1011”?不,等一下——4位二进制的数值位要占3位因为符号位占1位,所以-5的数值位还是“101”,符号位加在前面,结果是“1101”?哦,对,4位二进制的结构是“符号位+3位数值位”,所以+5是0符号+101数值=0101,-5是1+101=1101——没错,刚才的小错误修正后,逻辑更清晰:数值位的长度由原码的总位数决定,符号位占最高位,剩下的位置填绝对值的二进制。

小数原码:符号位+小数部分的二进制展开

小数的原码计算,核心还是“符号位+数值位”,但数值位变成了小数部分的二进制。比如定点小数假设小数点固定在符号位之后,比如+0.625的原码: 1. 符号位:正数,填“0”; 2. 数值位:0.625的二进制是多少?计算一下:0.625×2=1.25,取整数部分“1”;0.25×2=0.5,取“0”;0.5×2=1.0,取“1”——所以小数部分是“101”; 3. 拼接后是“0.101”小数点在符号位和数值位之间。

再比如-0.625的原码: 1. 符号位:负数,填“1”; 2. 数值位:还是0.625的二进制“101”; 3. 拼接后就是“1.101”——这就是-0.625的定点小数原码。

特殊情况:0的原码有两个

原码的一个特点是“0有两种表示”:+0和-0。比如4位原码中:
  • +0的符号位是0,数值位全0,即“0000”;
  • -0的符号位是1,数值位全0,即“1000”。 这是因为原码“符号位+数值位”的规则——+0的真值是“+0”,符号位0,数值位0;-0的真值是“-0”,符号位1,数值位0,所以出现了两个不同的原码表示同一个数值0。

    其实下来,原码的计算就两句话: 1. 看真值的正负:正就用0当符号位,负就用1; 2. 把真值的绝对值转换成二进制,跟符号位连起来——整数在前,小数在后,定点小数要意小数点的位置。

    不管是整数还是小数,不管是正数还是负数,原码的计算逻辑从未变过:用最直接的方式,把“正负”和“大小”拆成两部分,再拼回二进制里。这就是原码的本质——它是对真值最“直白”的二进制翻译,没有复杂的编码规则,只是“符号位+绝对值二进制”的简单组合。

延伸阅读: