授课语音

有符号数与无符号数

在计算机中,数字可以分为有符号数(signed numbers)和无符号数(unsigned numbers)。它们的区别在于如何表示和处理正数、负数和零。


一、无符号数(Unsigned Numbers)

无符号数是没有符号的数,它们只能表示非负整数。无符号数的二进制表示中,所有的比特位都用来表示数值,没有用于表示符号的位。它的范围从 0 到最大值,最大值由数据类型的比特数决定。

1. 无符号数的表示

  • 无符号整数使用所有的位来表示数值部分。例如,8位的无符号数使用 8 个二进制位来表示,范围是 0 到 255。
  • n 位无符号数的表示范围0(2^n - 1)

例子:

  • 8 位无符号数:00000000 表示 011111111 表示 255
  • 16 位无符号数:0000000000000000 表示 01111111111111111 表示 65535

2. 无符号数的运算

  • 无符号数的加法、减法、乘法和除法遵循常规的算术规则,不考虑符号。
  • 在计算机中,运算通常在二进制层面直接进行,因此无符号数的运算更加简单,且没有符号扩展的问题。

二、有符号数(Signed Numbers)

有符号数可以表示正数、负数以及零。为了表示负数,计算机通常使用符号位(最高位)来表示数的正负。常见的表示方法包括补码原码反码。在大多数现代计算机系统中,补码是最常用的表示方法。

1. 有符号数的表示

  • 原码:原码表示中,最高位是符号位,0 表示正数,1 表示负数,其余位表示数值。
  • 反码:反码的表示方式中,负数的表示是对原码的每一位取反。
  • 补码:补码是目前计算机中最常用的表示方式,它通过对负数的原码加 1 来表示。补码的优点是可以直接进行加减运算,简化了硬件实现。

补码表示法

  • 在补码表示法中,符号位(最高位)不仅用来表示符号,还影响数值的计算。
  • n 位有符号数的表示范围-2^(n-1)2^(n-1) - 1

例如,8 位有符号数:

  • 00000000 表示 0
  • 01111111 表示 127
  • 10000000 表示 -128(最低的负数)
  • 11111111 表示 -1

2. 有符号数的运算

  • 在有符号数的加法、减法、乘法、除法中,符号位需要特别处理。在补码表示下,数值的运算不需要特别处理符号,运算规则与无符号数类似,但需要注意进位和符号扩展。
  • 符号扩展:在进行有符号数运算时,需要通过符号扩展来保持数值的正确性,即将符号位进行扩展。

三、无符号数与有符号数的区别

特性 无符号数 有符号数
表示范围 0(2^n - 1) -2^(n-1)2^(n-1) - 1
符号位 没有符号位,所有位表示数值 最高位是符号位,0表示正数,1表示负数
使用场景 适用于仅需要表示非负整数的情况,如存储文件大小、计数器等 适用于需要表示负数和正数的情况,如温度、财务数据等
运算方式 运算时不考虑符号,直接处理数值部分 需要处理符号位,通常使用补码表示,支持负数运算
内存占用 占用的位数直接表示非负数 最高位用于表示符号,实际数值的范围相对较小

四、示例

1. 无符号数

假设有一个 8 位无符号数 11101101

  • 二进制:11101101
  • 十进制:128 + 64 + 32 + 8 + 4 + 1 = 237

2. 有符号数(补码)

假设有一个 8 位有符号数 11101101

  • 由于符号位为 1,表示负数。
  • 取反加一:00010011 -> 19,因此该数表示 -19

五、总结

  • 无符号数:只能表示非负整数,表示范围较大,运算简单。
  • 有符号数:能够表示正负数,通常使用补码表示,表示范围较小,运算更复杂。

在实际应用中,选择使用有符号数还是无符号数取决于数据的特点和所需处理的范围。在处理文件大小、计数器等非负数时,通常使用无符号数;而在需要表示负数的场景(例如温度、财务数据等)中,则使用有符号数。

去1:1私密咨询

系列课程: