对于有符号数而言,原码就是一个数的二进制表示。二进制的最高位是符号位,0 表示正数,1 表示负数。比如 56 是十进制,转为二进制就是 00111000,于是 56 的原码就是 00111000,左边第一位 0 是符号位,后面的其他数字是数据位。
计算机用数的原码进行显示,数的计算和存储是用补码进行的。
用原码对正数进行计算是不会有什么问题的。
正数的原码,反码和补码都一样,即正数三码合一。
负数的原码就是绝对值的原码的最高位的 0 改为 1。比如 56 是十进制,转为二进制就是 00111000,于是 56 的原码就是 00111000,于是 -56 的原码就是 10111000。
负数的反码的计算方式:原码的符号位不变,其他位取反,即 1 变成 0,0 变成 1。
负数的补码的计算方式:反码加 1。因此负数的反码等于补码减 1。即:
负数的补码 = 反码 + 1
负数的反码 = 补码 - 1
0 的反码和补码都是 0。
一个字节是 8 位,即 8 个 bit。一个字节的数字,最大是 01111111,转为十进制为 127。最小值为 11111111,转为十进制为 -127。
反码是为了解决原码不能计算负数的问题而出现的。负数计算的时候,如果结果不跨 0,是没有任何问题的,但是如果结果跨 0,则计算结果和实际结果有 1 的偏差。
补码是为了解决反码在负数计算时跨 0 的问题而出现的。补码还能多记录一个特殊的值,即 -128。-128 在一字节下没有原码和反码。
一般都是先根据一个数写出它的二进制表示,即得到原码,然后从原码得到反码,再从反码得到补码。最后用补码进行计算,计算结果是补码,再将这个结果转化为反码,再将反码转化为原码,最后输出原码。即:
一个数 → 原码 (二进制表示) → 反码 → 补码 → 进行计算 → 补码 → 反码 → 原码
计算得到补码时,如果补码的最高位为 0,说明是正数,则反码和原码也都和补码相等(三码合一)。
-128 没有原码和反码,只有补码。