大端 小端 原码 反码 补码 及内存中的表现
小端 和 大端
在內存中存儲時,都是從內存的低地址往高地址存,即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位限制,所以被舍去了
總結
以上是生活随笔為你收集整理的大端 小端 原码 反码 补码 及内存中的表现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: utf-8编码的字符串转成unicode
- 下一篇: float double 的存储方式