在c語言中,對於有符號數和無符號數之間的轉換是從位級的角度來考慮的而不是從數級的角度來考慮的。簡單說就是,對於有符號數和無符號數之間的轉換,我們希望的是在可以表示的範圍內,數值表示不變,但是c語言中,是二進位制位不變,改變解釋二進位制位的方式。
舉例:
乙個8位的無符號數128,二進位制位是10000000,轉為乙個8位的有符號數,二進位制位依舊是1000000,但是表示的是-128,因為位不變,改變解釋的方式,10000000用有符號數來解釋就是-128。
補碼轉為無符號數原理:
有符號是轉無符號數是,x<0時,轉為無符號數就是x+2^w,就像上面的例子,有符號數的最高位都為1,轉為無符號數時就相應的增加2^w,對於x>0的,二進位制解釋中無符號數和有符號數是一樣的,所以值是相同的。
無符號數轉為補碼原理:
無符號數轉補碼原理和補碼轉無符號數的原理是一樣的。無符號數的最高位1表示2^w,但是在補碼中最高位為1表示為負數,所以當u>tmax時,需要減去2^w。
深入理解計算機作業系統(三)
基本資料型別 大小端模式 整型數範圍與c標準 複合型型別轉換 從short到unsigned 讓我們複習一下c語言中基本資料型別的位元組數 名稱32位 64位char11 short int22 int4 4long int48 long long int88 char 48 float44 dou...
深入理解計算機作業系統(九)
本文將介紹儲存器層次結構以及區域性性對程式效能的影響。什麼是儲存器層次結構?區域性性 這個詞大家也許並不陌生,計算機中的儲存器從暫存器 快取到記憶體 硬碟,形成了乙個層次結構。為什麼不用單一的一種儲存裝置,比如只用硬碟呢?因為每一種儲存裝置都有它的優缺點,硬碟雖然儲存空間大,但傳輸速率太慢,完全跟不...
深入理解計算機作業系統(1) 鏈結器
鏈結是將各種 和資料片段收集起來組合成為乙個單一檔案的過程。可能發生在編譯 載入到記憶體 程式執行時候。首先使用預編譯器將mian.cpp翻譯成main.i ascii碼的中間檔案 再使用編譯器翻譯成main.s 彙編檔案 再使用彙編器翻譯成可重定位目標檔案main.o,最後使用鏈結器將main.o...