據(jù)的表示(原碼/反碼/補碼/移碼 IEEE754浮點數(shù))最全詳解)
目標(biāo)一文徹底搞定軟考上午題中“數(shù)據(jù)的表示”所有考點。包含詳盡概念、轉(zhuǎn)換方法、運算規(guī)則、大量例題和解題技巧看完這篇不用再看其他資料。一、機器數(shù)與真值計算機中所有數(shù)據(jù)以二進(jìn)制存儲一個數(shù)值連同符號位一起編碼后的形式稱為機器數(shù)它實際代表的數(shù)值稱為真值。符號位最高位0表示正1表示負(fù)。通常以固定位數(shù)表示如8位、16位、32位。機器數(shù)有四種常見編碼原碼、反碼、補碼、移碼。二、原碼True Form1. 定義最高位為符號位其余位表示數(shù)值的絕對值。正數(shù)符號位0數(shù)值部分就是真值的二進(jìn)制。負(fù)數(shù)符號位1數(shù)值部分是真值絕對值的二進(jìn)制。2. 求法直接根據(jù)定義寫出。3. 例子8位字長真值原碼500000101-510000101000000000-01000000012701111111-127111111114. 表示范圍8位整數(shù)最大01111111 127最小11111111 -127有兩個零0 和 -0所以范圍是-127 ~ 127共255個不同編碼256個編碼中有兩個零。5. 優(yōu)缺點優(yōu)點簡單直觀與真值轉(zhuǎn)換容易。缺點存在0和-0浪費編碼。加減運算需要單獨處理符號位硬件復(fù)雜。很少直接用于運算多用于表示浮點數(shù)的尾數(shù)原碼表示等場景。三、反碼One’s Complement1. 定義正數(shù)的反碼與原碼相同。負(fù)數(shù)的反碼符號位為1數(shù)值部分按位取反0變11變0。2. 求法正數(shù)直接等于原碼。負(fù)數(shù)先寫出正數(shù)的原碼符號位不變其余各位取反。3. 例子8位字長真值反碼500000101-511111010000000000-01111111112701111111-127100000004. 表示范圍8位整數(shù)同原碼-127 ~ 127也有兩個零。5. 作用反碼是求補碼的中間步驟。在早期計算機中曾用于運算但現(xiàn)代計算機幾乎不直接用反碼運算。四、補碼Two’s Complement1. 定義正數(shù)的補碼與原碼、反碼相同。負(fù)數(shù)的補碼在反碼的基礎(chǔ)上末位加1或等于模減去真值的絕對值。2. 求法方法一寫出該數(shù)絕對值的原碼按位取反符號位不變末位加1。方法二對于負(fù)數(shù)X補碼 模 - |X|。例如8位字長模為2^8256-5的補碼 256 - 5 251 11111011。3. 例子8位字長真值補碼500000101-511111011000000000-000000000與0相同12701111111-12810000000特殊4. 表示范圍8位整數(shù)補碼中0的表示唯一。多出一個編碼10000000表示-128。范圍-128 ~ 127共256個不同數(shù)值。5. 補碼的運算規(guī)則補碼的符號位可以當(dāng)作數(shù)值位參與運算結(jié)果仍為補碼。加法[AB]補 [A]補 [B]補減法[A-B]補 [A]補 [-B]補即減去一個數(shù)等于加上它的補碼取反加1。示例1計算 7 - 38位補碼7的補碼00000111 -3的補碼11111101 相加 00000111 11111101 ---------- 100000100 最高位進(jìn)位溢出丟棄 結(jié)果00000100 4示例2計算 -5 - 6-5補碼11111011 -6補碼11111010 相加 11111011 11111010 ---------- 111110101 溢出丟棄 結(jié)果11110101 -11 的補碼6. 溢出判斷當(dāng)兩個同號數(shù)相加或異號數(shù)相減結(jié)果超出了表示范圍時發(fā)生溢出。判斷方法方法一符號位判斷兩個正數(shù)相加結(jié)果符號為負(fù)或兩個負(fù)數(shù)相加結(jié)果符號為正則溢出。方法二進(jìn)位判斷最高數(shù)值位向符號位的進(jìn)位與符號位向更高位的進(jìn)位不同則溢出。設(shè)C1為最高數(shù)值位向符號位的進(jìn)位C2為符號位向更高位的進(jìn)位若C1⊕C21則溢出。方法三雙符號位法用兩位符號位00表示正11表示負(fù)結(jié)果符號位為01或10則溢出。示例8位補碼計算 100 100100補碼01100100 100補碼01100100 相加 01100100 01100100 ---------- 11001000 結(jié)果符號位為1負(fù)數(shù)但兩正數(shù)相加應(yīng)為正溢出實際上結(jié)果應(yīng)為200超出了8位補碼范圍-128~127因此溢出。7. 補碼的優(yōu)點0的表示唯一。符號位參與運算簡化硬件。減法可以用加法實現(xiàn)?,F(xiàn)代計算機中整數(shù)普遍采用補碼存儲和運算。五、移碼Offset Binary / Biased Representation1. 定義移碼通常用于表示浮點數(shù)的階碼。在真值X上加上一個偏移量偏置值得到。2. 偏移量的選擇對于n位二進(jìn)制數(shù)偏移量一般為2^(n-1)或2^(n-1)-1。軟考中常見規(guī)則移碼 補碼的符號位取反當(dāng)偏移量為2^(n-1)時。例如8位字長偏移量128移碼 補碼符號位取反。3. 求法方法一先求補碼然后將補碼的符號位取反。方法二真值 偏移量再轉(zhuǎn)換為二進(jìn)制。如8位偏移1285的移碼 5128 133 10000101-5的移碼 -5128 123 01111011。4. 例子8位字長偏移量128真值補碼移碼50000010110000101-511111011011110111270111111111111111-1281000000000000000000000000100000005. 特點移碼保持了數(shù)值大小順序移碼的無符號數(shù)值越大真值越大。因此兩個浮點數(shù)比較大小時可以直接比較移碼部分。在IEEE754中階碼采用移碼表示但偏移量為2^(n-1)-1如單精度階碼8位偏移127。這一點注意區(qū)分。六、四種編碼的比較與轉(zhuǎn)換總結(jié)編碼正數(shù)規(guī)則負(fù)數(shù)規(guī)則0的個數(shù)8位范圍原碼符號0絕對值符號1絕對值兩個-127 ~ 127反碼同原碼符號1數(shù)值取反兩個-127 ~ 127補碼同原碼反碼1一個-128 ~ 127移碼補碼符號位取反補碼符號位取反一個偏移后-128 ~ 127偏移128轉(zhuǎn)換關(guān)系正數(shù)原碼 反碼 補碼移碼 補碼符號位取反。負(fù)數(shù)原碼 → 反碼數(shù)值取反→ 補碼1移碼 補碼符號位取反。七、浮點數(shù)表示與IEEE754標(biāo)準(zhǔn)1. 浮點數(shù)的基本格式一個二進(jìn)制浮點數(shù)可以表示為N(?1)S×M×2E N (-1)^S \times M \times 2^EN(?1)S×M×2ES符號位0正1負(fù)。M尾數(shù)純小數(shù)通常采用規(guī)格化形式。E階碼表示指數(shù)部分常用移碼或補碼表示。規(guī)格化使尾數(shù)的絕對值位于[0.5,1)或[1,2)以保證最高有效位為1提高精度。2. IEEE754標(biāo)準(zhǔn)IEEE754是目前最廣泛使用的浮點數(shù)標(biāo)準(zhǔn)規(guī)定了單精度32位和雙精度64位格式。1單精度float32位1位8位23位符號S階碼E移碼偏移127尾數(shù)M隱含最高位1階碼8位采用移碼表示偏置值 2^(8-1)-1 127。尾數(shù)23位存儲的是小數(shù)點后的部分小數(shù)點前隱含1。真值N(?1)S×1.M×2E?127N (-1)^S \times 1.M \times 2^{E-127}N(?1)S×1.M×2E?1272雙精度double64位1位11位52位符號S階碼E移碼偏移1023尾數(shù)M隱含最高位1階碼11位偏置值 2^(11-1)-1 1023。真值N(?1)S×1.M×2E?1023N (-1)^S \times 1.M \times 2^{E-1023}N(?1)S×1.M×2E?10233. 特殊值階碼E尾數(shù)M表示的值全0全00正0或負(fù)0由符號位決定全0非0非規(guī)格化數(shù)極小值全1全0無窮大∞或-∞全1非0NaN非數(shù)4. 十進(jìn)制轉(zhuǎn)IEEE754單精度詳細(xì)步驟例1將 -12.75 表示為IEEE754單精度浮點數(shù)。符號位S負(fù)數(shù) → S 1絕對值二進(jìn)制整數(shù)部分12 1100小數(shù)部分0.75 0.11合并12.75 1100.11規(guī)格化移動小數(shù)點使整數(shù)部分只有一位11100.111.10011 × 2^3指數(shù)真值為3。計算階碼EE 3 127 130 100000108位尾數(shù)部分隱含最高位1存儲小數(shù)部分10011后面補0至23位10011000000000000000000組合S(1) E(8位) M(23位) 1 10000010 10011000000000000000000二進(jìn)制串110000010100110000000000000000005. 十進(jìn)制轉(zhuǎn)IEEE754雙精度示例例2將 0.5 表示為雙精度浮點數(shù)。0.5 0.1二進(jìn)制 1.0 × 2^(-1)S 0正數(shù)階碼E -1 1023 1022 0111111111011位尾數(shù)1.0隱含1存儲0.0即52位全0組合0 01111111110 0000...052個06. IEEE754二進(jìn)制串轉(zhuǎn)十進(jìn)制例3將單精度浮點數(shù)11000001010011000000000000000000轉(zhuǎn)換為十進(jìn)制。拆分S1, E10000010130, M10011000000000000000000指數(shù)e E - 127 130 - 127 3尾數(shù)隱含1所以實際尾數(shù) 1.10011二進(jìn)制值 (-1)^1 × 1.10011 × 2^3 -1.10011 × 81.10011二進(jìn)制 1 0.5 0 0 0.0625 0.03125 1.59375乘以8 12.75符號負(fù) → -12.757. 浮點數(shù)的表示范圍與精度以單精度為例最小規(guī)格化正數(shù)階碼最小為1E1尾數(shù)全0真值 1.0 × 2^(1-127) 2^(-126) ≈ 1.18 × 10^(-38)最大正數(shù)階碼最大為254E254因為255保留給特殊值尾數(shù)全1真值 ≈ (2 - 2^(-23)) × 2^(254-127) (2 - 2^(-23)) × 2^127 ≈ 3.4 × 10^38精度尾數(shù)23位有效數(shù)字為24位二進(jìn)制約7~8位十進(jìn)制有效數(shù)字。雙精度范圍約為 ±1.8 × 10^308精度約15~16位十進(jìn)制有效數(shù)字。八、常見軟考題型及解題方法題型一編碼轉(zhuǎn)換求原碼、反碼、補碼、移碼例1若機器字長為8位求十進(jìn)制數(shù) -37 的原碼、反碼、補碼。解析37的二進(jìn)制3241 100101用7位表示0100101不足補0原碼符號位1 數(shù)值位10100101反碼符號位不變數(shù)值取反11011010補碼反碼1 11011011例2某機器字長8位采用補碼表示則十進(jìn)制數(shù) -128 的補碼是解析8位補碼范圍 -128 ~ 127-128的補碼為10000000特殊值。驗證按規(guī)則-128絕對值128 100000008位取反01111111加110000000正是該值。例3若[X]補 11110000求X的真值。解析補碼最高位為1是負(fù)數(shù)。真值 -補碼取反1的絕對值取反00001111加100010000 16所以 X -16。題型二補碼運算及溢出判斷例4設(shè)機器字長8位用補碼運算計算 45 - 23并判斷是否溢出。解析45補碼0010110123補碼00010111-23補碼11101001相加00101101 11101001 100010110最高位進(jìn)位丟棄結(jié)果00010110 22兩數(shù)異號相減不會溢出所以結(jié)果正確。例5若X-90Y-80用8位補碼計算XY判斷溢出。解析X補碼-90 → 9001011010取反10100101加110100110Y補碼-80 → 8001010000取反10101111加110110000相加10100110 10110000 1 01010110去掉進(jìn)位得01010110 86正數(shù)兩個負(fù)數(shù)相加結(jié)果為正說明溢出符號位判斷。實際結(jié)果 -170 超出8位補碼范圍 -128~127。題型三十進(jìn)制與IEEE754互轉(zhuǎn)例6將十進(jìn)制數(shù) -0.75 表示為IEEE754單精度浮點數(shù)。解析0.75 0.11二進(jìn)制規(guī)格化0.11 1.1 × 2^(-1)S1負(fù)數(shù)階碼E -1 127 126 01111110尾數(shù)1.1隱含1存儲.1即1000…022個0組合1 01111110 1000000000000000000000010111111010000000000000000000000例7IEEE754單精度數(shù)01000001001000000000000000000000的十進(jìn)制值是多少解析S0E10000010130M01000000000000000000000指數(shù)e 130-1273尾數(shù) 1.0100… 1.25值 1.25 × 2^3 10.0題型四浮點數(shù)表示范圍/精度相關(guān)計算例8某浮點數(shù)格式為1位符號位5位階碼移碼偏移1510位尾數(shù)隱含最高位1純小數(shù)。求它能表示的規(guī)格化正數(shù)的最大值和最小值。解析階碼5位偏移15最大階碼真值 2^5-2全1保留給無窮大 30所以最大指數(shù) 30-1515。尾數(shù)10位隱含1最大尾數(shù) 1.1111111111二進(jìn)制≈ 2 - 2^(-10)。最大正數(shù) ≈ (2 - 2^(-10)) × 2^15。最小規(guī)格化正數(shù)階碼取最小值1全0保留給0真值 1-15 -14尾數(shù)最小為1.0所以最小值 2^(-14)。題型五特殊值判斷例9IEEE754單精度中當(dāng)階碼全0、尾數(shù)非0時表示什么解析表示非規(guī)格化數(shù)用于表示非常接近0的數(shù)其值為 (-1)^S × 0.M × 2^(-126)。例10判斷01111111100000000000000000000000在IEEE754單精度中表示什么解析S0E11111111255全1M0 → 表示正無窮大 ∞。九、易錯點與注意事項補碼求負(fù)數(shù)時“取反加1”是指對數(shù)值位取反符號位不變但求補碼后符號位可能變化如-128。**移碼與補碼符號位取反的關(guān)系只適用于偏移量為2(n-1)的情況**。IEEE754中階碼偏移量為2(n-1)-1不能直接套用該關(guān)系需用移碼定義計算。原碼、反碼、補碼的正數(shù)部分都相同。補碼中100…0表示-2^(n-1)如8位補碼10000000為-128。IEEE754中規(guī)格化尾數(shù)隱含最高位1轉(zhuǎn)換時不要忘記加上這個1。浮點數(shù)表示范圍由階碼決定精度由尾數(shù)位數(shù)決定。單精度浮點數(shù)的階碼范圍1~2540和255有特殊意義。補碼溢出判斷同號相加結(jié)果符號改變即為溢出或采用雙符號位法。十、總結(jié)與速記表速記1編碼轉(zhuǎn)換口訣正數(shù)原反補都相同移碼符號取反。負(fù)數(shù)原碼→反碼數(shù)值取反→補碼1→移碼符號取反。補碼轉(zhuǎn)真值符號位為0直接算符號位為1數(shù)值取反加1后加負(fù)號。速記2IEEE754單精度格式1位符號8位階碼移碼偏移12723位尾數(shù)隱含1。真值 (-1)^S × 1.M × 2^(E-127)特殊值E0,M0 → 0E255,M0 → ∞E255,M≠0 → NaN。速記3常用轉(zhuǎn)換步驟十進(jìn)制 → IEEE754符號位。絕對值二進(jìn)制小數(shù)點移位規(guī)格化。指數(shù)偏移量得到階碼。小數(shù)點后部分填尾數(shù)隱含1不存。組合。IEEE754 → 十進(jìn)制拆分S,E,M。E-偏移量得指數(shù)。尾數(shù)加隱含1計算1.M。按公式計算符號決定正負(fù)。發(fā)布日期2026-08-29