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