正數的補碼怎么求 正數的補碼

正數的補數(如何求正數的補數)
馮諾依曼系統結構計算機處理的所有數據和指令都用二進制數表示 。
在計算機運行的過程中,要執行的程序和處理過的數據首先存儲在主存儲器(內存)中 。當計算機執行程序時,它會自動地、順序地從主存中取出指令,并逐一執行 。這個概念叫做順序執行程序 。
硬件由五部分組成:運算器、控制器、存儲器、輸入設備和輸出設備 。
數據的內置表示二進制表示法計算機中的數字必須用二進制數字串來表示,就像數字一樣 。因此,符號也必須用0和1來表示 。最高位0表示正,1表示負,sign的這種數字內部表示稱為“機器號”,而sign在機器外部表示的對應數稱為“真值”,將一個真值表顯示為二進制字符串的機器號的過程稱為編碼 。
原始代碼是符號位加上真值的絕對值,即第一位代表符號,其余位代表值 。例如,如果是8位二進制:[+1]original = 0000001[-1]original = 1000001,第一位是符號位 。因為第一位是符號位,所以8位二進制數的取值范圍是:【1111 1111 。
反碼的表示方法是:正數的反碼是其自身負數的反碼,以其原碼為基礎,符號位不變,其余位倒置 。[+1]=[00000001]Original =[0000001]Inverse[-1]=[1000001]Original =[1111110]
補數的表示方法是:正數的補數是其自身負數的補數,以其原碼為基礎,符號位不變,其余位反轉,最后+1 。(即在其補碼的基礎上+1)[+1]=[00000001]original =[0000001]anti =[000001]complement[-1]=[1000001]original =[1111110]anti =[1111111]
定點和浮點定點是小數點固定的數字 。電腦里沒有小數點專用的位,默認約定小數點的位置 。一般固定在機器號最低位之后或符號位之后 。前者叫定點純整數,后者叫定點純小數 。定點表示簡單直觀,但數值表示范圍過小,操作時容易溢出 。
浮點數是小數點位置可以改變的數字 。為了擴大數值表示的范圍,防止溢出,采用了浮點表示 。浮點記數法類似于十進制中的科學記數法 。
浮點數在計算機中通常分為順序碼和尾數,其中順序碼一般用補碼定點整數表示,尾數一般用補碼或原定點小數表示 。為了保證有效位不丟失,尾數進行了歸一化處理,即通常的科學記數法,即尾數最高位為1,實際值用順序碼調整 。
順序符號表示指數的符號位,順序代碼表示冪,數字符號表示尾數的符號位,尾數表示歸一化的十進制值 。
N =尾數×基數順序碼(指數)
位、字節、字比特:“比特”是電子計算機中最小的數據單位 。每個位的狀態只能是0或1 。
字節:八個二進制位構成一個“字節”,是存儲空之間的基本計量單位 。一個字節可以存儲一個英文字母或者半個漢字,換句話說,一個漢字占用2個字節空的存儲空間 。
字:“字”由若干字節組成,字數稱為字長 。不同等級的機器字長不同 。例如,對于8位計算機,一個字等于一個字節,字長為8位 。如果是16位計算機,那么它的字由2個字節組成,字長為16位 。字是計算機數據處理和運算的單位 。
字節順序字節序是指一種以上字節類型的數據在內存中的存儲順序,通常有小端和大端兩種字節序 。
小字節順序是指低字節數據存儲在內存的低地址,高字節數據存儲在內存的高地址;
大端意味著高字節數據存儲在低地址,低字節數據存儲在高地址 。
基于X86平臺的PC是小端,有些嵌入式平臺是大端 。所有的網絡協議也使用big endian來傳輸數據 。所以有時候我們也把大端法叫做網絡字節序 。
例如,數字0x12345678在兩個不同字節順序的CPU中的存儲順序如下:
BigEndian低地址高地址---------------------------------------------------->+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|12|34|56|78|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+LittleEndian低地址高地址---------------------------------------------------->+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|78|56|34|12|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+從上面兩張圖可以看出,使用Big Endian存儲數據是符合我們人類的思維習慣的 。
union的存儲順序是所有成員從低位地址開始存儲 。利用這個特性,可以判斷CPU是以小端還是大端模式讀寫內存 。
示例代碼如下:
uniontest{shorti;charstr[sizeof(short)];}tt;voidmain(){tt.i=0x0102;if(sizeof(short)==2){if(tt.str[0]==1&&tt.str[1]==2)printf("大端字節序");elseif(tt.str[0]=2&&tt.str[1]==1)printf("小端字節序");elseprintf("結果未知");}elseprintf("sizof(short)=%d,不等于2",sizeof(short));}字節對齊在現代計算機中,內存空是按字節劃分的 。從理論上講,似乎對任何類型變量的訪問都可以從任何地址開始,但實際上在訪問特定類型的變量時,往往是在特定的內存地址進行訪問,這就需要將各種數據按照一定的規則排列在內存空中,而不是一個一個地排出,這就是對齊 。

推薦閱讀