值溢出(usignedchar最大255)

题目来源:腾讯

答案:

在计算机中的基本单位:字节(Byte)比特(bit) 关系如下

image-20220501125114970

在计算机中任意的数据都以二进制 bit 的形式存在

以一个类型为 int8,值为 7 的数据为例,末尾三位的二进制和为数值 7,由于 int8 是有符号整型,因此符号位为 0

image-20220501130059410

对于数据的 bit 形式有 原码、反码、补码和移码

在计算机中一般用补码存储数据

对于正数 补码 = 原码,对于负数 补码 = 除符号位外全部取反,然后 + 1

以 int8, 值为 -7 的数据为例

image-20220501132354739

由于 unsigned char 是无符号数据类型,因此当 8 个 bit 全为 1 时,表示最大值

27+26+…+21+20\=25527+26+…+21+20\=255

此时如果 +1 则会发生进位,此时的 unsigned char 就有了 9 个 bit 的数据,这当然是不允许的

计算机为了保证数据类型的 bit 位一致,对进位后的 1 会直接舍去

image-20220501130618464

同时,在计算机中数据一般以 补码 的形式存在,因此正数的补码 1111111 + 1 = 00000000

将补码 00000000 转换为源码就是 00000000,值为 0