原码、反码、补码
-
正数的原码, 反码, 补码相同
-
负数
-
反码通过原码取反得到
-
补码通过反码+1得到
-
补码+1可以得到原码
-
C语言中的整数在内存中存储的是补码
简化运算:使用补码可以简化加法、减法和乘法等运算
唯一表示:使用补码可以避免出现两个零的问题,只有一个零值。
范围表示:补码能够更好地表示有符号整数的范围,因为最高位被用作符号位,其余位用于表示数值。
示列:
数值 | 原码 | 反码 | 补码
-------|---------------|---------------|-------------
+0 | 00000000 | 00000000 | 00000000
-0 | 10000000 | 11111111 | 00000000
+3 | 00000011 | 00000011 | 00000011
-3 | 10000011 | 11111100 | 11111101
从上表可以看出,原码和反码表示中存在两个零,而补码表示中只有一个零,避免了数值的重复。这使得补码更方便进行数值运算和表示范围。
大小端字节序
- 字节序: 数据在内存中的存储方式
- 大端: 低位字节存高地址
- 小端: 低位字节存低地址
- 例如: 0x12345678 --大端:0x12 0x34 0x56 0x78 -- 小端: 0x78 0x56 0x34 0x12
- 内存中: 从左往右为低地址->高地址, 在数学中为高位->低位
判断大小端
int judge_sys()
{
int value = 1;
return *(char*)(&value);// 1 : 小端 0 : 大端
}
- 大端:00 00 00 01 小端: 01 00 00 00 我们取出1个字节判断即可
浮点数在内存中的存储
浮点数的内存存储由三个部分组成:符号位、指数位和尾数位。
符号位 指数位 尾数位
----------------------------------------
| s | e | f |
----------------------------------------
- 符号位(s): 占用1个bit位, 0表示正, 1 表示负
- 指数位(e): 占用8个bit位, 用于表示浮点数的指数部分
- IEEE 754标志规定E的实值要加一个中间数127(32位下), 1023(64位下)
- 尾数位(f): 占用23个bit位, 用于表示浮点数的尾数部分.
- IEEE 754标准规定 高位默认为1, 不显式存储
- 示例: 8.0在内存中的存储: s = 0. e = 3(在内存中加上127), f = 0 然后转换为二进制即可