C语言的原码、反码和补码
经典著作《C和指针》说过,对于C语言而言,只有四种类型:
- 整形
- 浮点型
- 指针型
- 聚合型(比如数组、结构体等)
有人就说了,明显的有char
类型吗,不过你可以看看char
的范围,就能理解这个char
是一个微型的正数,范围在-128~127
或者0-255
之间,为什么会是两个范围呢,仔细想想signed
和unsigned
的区别。
建议阅读这个经典著作,对指针的理解会上升一个层次
其中整数在计算机内部基本使用补码来表示,这里就说下原码、反码和补码。
先抛出他们的定义:
原码:原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
反码:正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
补码:正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1(也可以认为是在反码的基础上+1)
举个例子说明一下:
类别 | 正数 | 负数 | 备注(十进制) |
---|---|---|---|
原码 | 0b00011011 | 0b10011011 | 27/-27 |
反码 | 0b00011011 | 0b11100100 | 27/-100 |
补码 | 0b00011011 | 0b11100101 | 27/-101 |
对于计算机而言,能理解的只有二进制,也就是电路里面的高低或者叫开关。 |