原码, 反码, 补码
大前提(8Bit情况下,最高位代表符号位)
小前提:设计思路符合时钟计数和数学上模的概念
-
原码:最直观的表示
[+1] = [0000 0001]原
[-1] = [1000 0001]原
缺点:负数无法直接让计算机计算,结果不对 -
反码:(解决负数问题)
- 正数的反码是自身
- 负数的反码是在其原码的基础上,符号位不变,其余各个位取反
- 由于计算机不认识人的规定,所以会让符号位参与计算。
- 另外,在数学里1-1可以这么写:1 + (-1)
[+1] = [0000 0001]反
[-1] = [1000 0001]原 = [1111 1110]反
缺点:反码计算会产生1000 0000 和0000 0000两种表示0的结果(+0,和-0)
-
补码(解决0符号位问题)
- 正数的补码是自身
- 负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后加一
[+1] = [0000 0001]原
[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补
有效的解决了-0的问题 [-0] = [1000 0000]原 = [1111 1111]反 = [0000 0000]补 = [+0]
那么原来的[1000 0000]在内存中表示什么呢,规定表示 -128 他没有原码和反码,因为他是-0弃用的表示
具体和硬件实现有关8bit能表示256个数 [-128] Mod 256 = 128 ,就是说从正向数128就是-128,
但是由于正数在内存(二进制表示)里规定是0开始的。所以正数最大值要-1
结论:
1.8位有符号整形的表示范围 -128~127
2.8位无符号整形的表示范围 0~255
浙公网安备 33010602011771号