在计算机中,负数通常使用补码来表示。下面以8位有符号数为例,展示-1、-2和-3的二进制和十六进制形式,以及它们的计算方法。

十进制数 二进制原码 二进制反码 二进制补码(内存中存储的形式) 十六进制补码
-1 1000 0001 1111 1110 1111 1111 0xFF
-2 1000 0010 1111 1101 1111 1110 0xFE
-3 1000 0011 1111 1100 1111 1101 0xFD

计算负数的补码遵循以下固定步骤:

原码​:先写出该负数绝对值的二进制表示(即对应的正数),最高位(符号位)设为1。例如,对于-3:3的二进制是 0000 0011。-3的原码是 1000 0011。
反码​:保留符号位不变,将原码的数值位(后7位)按位取反(0变1,1变0)。-3的原码 1000 0011取反后得到反码 1111 1100。
补码​:在反码的基础上,最低位加1。-3的反码 1111 1100加1后得到最终的补码 1111 1101。

计算机采用补码主要有三个重要原因:

  • 统一加减法​:可以将减法运算转换为加法运算,CPU只需一个加法器就能处理 both 加法和减法,简化了硬件设计。例如,计算 3 - 3等同于计算 3 + (-3)。用补码计算:0000 0011(3的补码) + 1111 1101(-3的补码) = 1 0000 0000。由于是8位系统,最高位的进位1被自然舍弃,结果就是 0000 0000(0),结果正确。

  • 解决0的编码唯一性​:在原码表示中,0有+0(0000 0000)和-0(1000 0000)两种表示,这会造成浪费和混淆。而在补码中,-0(1000 0000)加1后进位,同样得到 0000 0000,从而保证了0的编码唯一性。

  • 扩展表示范围​:8位补码可以表示的范围是-128到+127,比原码的-127到+127多表示一个数(-128)。

需要特别注意的是,一个负数的十六进制表示长度取决于数据类型的位数

  • 8位系统(如 char)中,-2 表示为 0xFE

  • 16位系统(如 short)中,-2 表示为 0xFFFE

  • 32位系统(如 int)中,-2 表示为 0xFFFFFFFEQIAN

这是因为在高位会进行符号扩展,即用1来填充多余的位数,以保持其负数值不变

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐