负数强转成无符号数,一定比所有有符号数大?

今天看到一个结论:负数强转成无符号数,一定比所有有符号数大 我们来看这个结论是怎么来的: 首先搞清楚负数在二进制中是怎么存储的 其次搞清楚负数强转成无符号数是怎么转换的。 搞清楚这两个问题就得出结论了。

首先搞清楚负数在二进制中是怎么存储的

负数在二进制中是以正数的补码形式保存的。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理

先介绍一下“模”的概念:“模”是指一个计量系统的计数范围,如过去计量粮食用的斗、时钟等。计算机也可以看成一个计量机器,因为计算机的字长是定长的,即存储和处理的位数是有限的,因此它也有一个计量范围,即都存在一个“模”。如:时钟的计量范围是0~11,模=12。表示n位的计算机计量范围是0 ~ 2n - 1,模=28

例如:假设当前时针指向8点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨2小时,即8-2=6;另一种是顺拨10小时,8+10=12+6=6,即8-2=8+10=8+12-2(mod 12).在12为模的系统里,加10和减2效果是一样的,因此凡是减2运算,都可以用加10来代替。若用一般公式可表示为:a-b=a-b+mod=a+mod-b。对“模”而言,2和10互为补数。实际上,以12为模的系统中,11和1,8和4,9和3,7和5,6和6都有这个特性,共同的特点是两者相加等于模。对于计算机,其概念和方法完全一样。n位计算机,设n=8,所能表示的最大数是11111111,若再加1成100000000(9位),但因只有8位,最高位1自然丢失。又回到了 00000000,所以8位二进制系统的模为 28。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。

符号位

符号位为每个字节的最高位,最高位为1表示负数,为0表示正数。

负数的计算

计算方式:原码>反码>补码 例如十进制 -8 原码:1 000 1000 (符号位=1,负数) 反码:1 111 0111 (符号位不变,数值位分别“按位取反”) 补码:1 111 1000 (反码的末位+1) 因此-8 在 8位机器中用 1111 1000表示

负数强转无符号数的过程

先说正数,就像正数的反码补码都是它本身一样,3 = 0b 011 无符号数就是原码依然是它本身,且最高位也不表示符号位。和正数的区别就是多了一个最高位的有效数位。 例如:0b011 = 3 和 0b110 = 6 (如果是有符号的话 = -1) 可以看到所有的负数补码最高位都是1,那么强转的话,计算机直接将二进制码看做无符号数,最高位 =1 的数肯定 > 所有正数(最高位 = 0)