小端 和 大端
在内存中存储时,都是从内存的低地址往高地址存,即0x00000000 -> 0xffffffff
以汉字 “严”为例,Unicode码是4E25,需要两个字节存储,一个字节是0x4E,另一个字节是0x25.
低字节先存(该值的起始内存位置,即从低地址单元,先存0x25),叫小端
高字节先存(该值的起始内存位置,即从低地址单元,先存0x4E),叫大端
另一个分辨办法,从该值的起始内存位置(内存起始)位置开始读
顺着我们读习惯的(我们读为4E25),就是大头方式,否则就是小头方式
切记:原码 反码 补码 都是针对整数来说的,小数不使用这种办法
原码 = 符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
反码 = (正整数) 原码本身
(负整数) 在原码基础上,符号位不变,其余各个位取反
补码 = (正整数) 原码本身
(负整数) 在反码基础上 + 1
-1的原码: 1000 0000 0000 0000 0000 0000 0000 0001
-1的反码:1111 1111 1111 1111 1111 1111 1111 1110
-1的补码:1111 1111 1111 1111 1111 1111 1111 1111
十六进制: f f f f f f f f 即0x ff ff ff ff
-1的实际内存表现: 0x ff ff ff ff
机器为小端,低位先存,所以最终存储为0x ff ff ff ff,因为各字节都相同,看不出字节序
12的原码:0000 0000 0000 0000 0000 0000 0000 1100
12的反码:0000 0000 0000 0000 0000 0000 0000 1100
12的补码:0000 0000 0000 0000 0000 0000 0000 1100
十六进制: 0 0 0 0 0 0 0 c 即0x 00 00 00 0c
12的实际内存表现: 0x 0c 00 00 00
机器为小端,低位先存,所以最终存储为0x0c 00 00 00
-12的原码:1000 00000000 0000 0000 0000 0000 1100
-12的反码:1111 11111111 1111 1111 1111 1111 0011
-12的补码:1111 11111111 1111 1111 1111 1111 0100
十六进制: f f f f f f f 4 即0x ff ff ff f4
-12的实际内存表现: 0x f4 ff ff ff
机器为小端,低位先存,所以最终存储为0x f4 ff ff ff
1023的原码:0000 0000 0000 0000 0000 0011 1111 1111
1023的反码:0000 0000 0000 0000 0000 0011 1111 1111
1023的补码:0000 0000 0000 0000 0000 0011 1111 1111
十六进制: 0 0 0 0 0 3 f f 即0x 00 00 03 ff
1023的实际内存表现: 0x ff 03 00 00
机器为小端,低位先存,所以最终存储为0x ff 03 00 00
-128的原码:1000 00000000 0000 0000 0000 1000 0000
-128的反码:1111 11111111 1111 1111 1111 0111 1111
-128的补码:1111 11111111 1111 1111 1111 1000 0000
十六进制: f f f f f f 8 0 即0x ff ff ff 80
-128的实际内存表现: 0x 80 ff ff ff
机器为小端,低位先存,所以最终存储为0x 80 ff ff ff
当只有一个字节的时候:
-128的原码: 1000 0000
记忆法:-128的原码原本是:1 1000 0000 ,最前面的1表负的,1000 0000表128
但是最前面的1超出了8位限制,所以被舍去了
-128的反码: 0111 1111
记忆法:-128的反码原本是:1 0111 1111 ,在原码基础上,符号位不变,其余各位取反
但是最前面的1超出了8位限制,所以被舍去
-128的补码: 1000 0000
记忆法:-128的补码原本是:1 1000 0000 ,仍然是在反码基础上,+1得到
但是最前面的1超出了8位限制,所以被舍去了