原碼、反碼、補碼、有符號數和無符號數運算


  1. 原碼

原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值. 比如如果是8位二進制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符號位. 因為第一位是符號位, 所以8位二進制數的取值范圍就是:

[1111 1111 , 0111 1111]

[-127 , 127]

原碼是人腦最容易理解和計算的表示方式.

  1. 反碼

反碼的表示方法是:

正數的反碼是其本身

負數的反碼是在其原碼的基礎上, 符號位不變,其余各個位取反.

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

可見如果一個反碼表示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算.

  1. 補碼

補碼的表示方法是:

正數的補碼就是其本身

負數的補碼是在其原碼的基礎上, 符號位不變, 其余各位取反, 最后+1. (即在反碼的基礎上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]補

[-1] = [10000001]原 = [11111110]反 = [11111111]補

對於負數, 補碼表示方式也是人腦無法直觀看出其數值的. 通常也需要轉換成原碼在計算其數值.

負數采用補碼編碼:例如char t=-2, 
原碼是1010,則反碼是:1101,補碼是:1110,即-2的機器表示為1110;

因為c語言中規定同級別的無符號數的精度高於有符號數,所以會隱式地將:有符號數轉為無符號數(底層位級表示不變,只是解讀方式不同)。

#include<stdio.h> #include<stdlib.h> void main() {   int a = -3;   unsigned int b = 2;   long c = a + b;   printf("%ld\n",c); } A:-1 B:4294967295 C:0x7FFFFFFF D:0xFFFFFFFF

正確答案為:AB 

解析: 
無符號和有符號整數進行運算時,有符號整數會被提升為無符號整數。 
-3對應的二進制表示是0xfffffffd,和2相加表示0xffffffff。 
輸出結果取決於long是32位,還是64位。這個取決於編譯器和機器。 
long是有符號的整型。 
如果是32位,0xfffffff在補碼表示法(最高位是負數位)下是等於-1. 
如果是64位,0xfffffff是屬於long的正整數范圍(負數位在第64位),等於4294967295。 
(如果你的編譯出來是32位的long,你可以用longlong測試一下就能得到這個數。因為 long long 無論在32位機器或者64位機器都是占用8個字節64位)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM