1. 整數的有符號表示方式
計算機中目前常用的整數型別分為int_32
和int_64
,以32位為例。計算機中都以補碼形式存放有符號數。
正整數的補碼表示和正整數的無符號型別一致,符號位為0;
負整數的補碼表示則需要依次經過求反碼,求補碼,舉例如下
對於-4而言,則符號位為1, 4的二進位制表示為 000 0000 0000 0100
求反碼: 111 1111 1111 1011
求補碼(反碼-1): 111 1111 1111 1010
則最終-4在計算機中補碼形式為: 1111 1111 1111 1010 (0xfffa)
很多程式語言並沒有無符號數,在實際程式設計中很少用到有符號數,c語言是支援無符號數的,但是不恰當的使用無符號數會導致一些很危險的操作,當乙個有符號數和乙個無符號數運算時,有符號數會被轉換成無符號數的形式(隱式轉換)。所以除非在特別確定的場景下(如計數器),否則盡量不要為了省點空間而採用unsigned
這種炫技字首。
2. 浮點數的有符號表示方式
相信很多關於浮點數的網上資料都是ieee 754的拷貝,把本來很簡單的東西說的很複雜,其實就是一張圖的問題
再額外舉乙個例子,兩相對比,將會對浮點數的精度不定和截斷誤差有更深的理解。
浮點數:4.025675
整數部分4: 0010 ; 小數部分:.0000
0110
1001
0010
1010
01
第一次整合:10.
0000
0110
1001
0010
1010
01 可以發現小數點要向左移動1位才能到符號位1之後
則e = 127 + 1 = 128,即e: 1000
0000
符號位為0,代表正數
最終表示為:0
1000
0000
.0000
0011
0100
1001
0101
001即對應十六進製制0x4001a4a9
從上面可以看到浮點數由於存在著移位偏移的原因,故而導致浮點數的最小精度是不定的,這也浮點數存在截斷誤差的原因所在。可以看到浮點數的儲存格式和整數的儲存格式不同,這也是為何整數和浮點數做運算必須先將整數轉換為浮點數,而整數轉換為浮點數很簡單,因為整數是浮點數的乙個特例,即小數部分為0。
2. 有符號整數的運算方式
加法
有符號整數的加法其實很簡單,即兩個有符號整數的補碼相加(符號位也是要正常進製),然後計算結果作為正常有符號整數進行解析,舉兩個例子
-3 + -2
出於簡單起見,資料內容設定為4位,符號位設定在第5位,則-3: 1 1101; -2: 1 1110
1 1101 + 1 1110 = 11 1011截斷為1 1011,解析為-5
-4 + 8
出於簡單起見,資料內容設定為4位,符號位設定在第5位,則8: 0 1000; -4: 1 1100
則0 1000 + 1 1100 = 10 0100截斷為0 0100即為4
減法從上面-4+8
可以看到,先將減數轉換為補元,然後再和被減數相加即可。即可將有符號整數的減法轉換為加法。
8 - 4
出於簡單起見,資料內容設定為4位,符號位設定在第5位,則4的補元為2^4-4 = 12即1100,同時符號位取反,即為1
則得到4的補元為:1 1100,其實即為-4,這樣便可以轉換成下面的加法
-4 + 8
出於簡單起見,資料內容設定為4位,符號位設定在第5位,則8: 0 1000; -4: 1 1100
則0 1000 + 1 1100 = 10 0100截斷為0 0100即為4
乘法其實乘除運算歸根結底還是移位運算+加法運算的結合,其實原理和我們10進製乘法移位疊加並無本質區別。有符號整數的乘法一般是借助硬體加法器完成的,有補碼一位乘法、兩位乘法和三位乘法,位數越多,則計算速度越快,但對輔助的暫存器要求也越高。乘法的器的設計也是滿精巧的,不過一般而言並無太多必要去了解。 計算機中有無符號數的表示方法
反碼 正數的反碼為原碼,負數的反碼是原碼符號位外按位取反 補碼 正數的補碼為原碼,負數的反碼是反碼 1 在計算機中用補碼表示資料的原因 如果二進位制第一位是0的話,代表正數,1的話代表負數.比如 1的表示方法是 以8位數字為例.10000001 這就是 1的表示方法,第乙個1就是符號位.這種表示方法...
計算機中的有符號數和無符號數
1.概念 在計算機中,可以區分正負型別的數,成為 有符號數 signed 無正負型別的數 只有整數型別 成為 無符號數 unsigned 簡明的說,無符號說就是其所有的位數都用來表示數值的大小,有符號數除最高位來表示數值的正負外 0表示正數 1表示負數 其餘各位用來表示數值的大小。舉個例子說明一下 ...
有符號數和無符號數在計算機中怎麼區分?
確如題主所說,計算機中儲存的任何資料都是二進位制形式,單看資料是無法認定其格式和內容的。計算機要用二進位制編碼來表達數值的符號,最直觀的方法就是符號位。但為了保證基本算術運算在正負數上的一致性,x86計算機對負數採用了特殊的編碼方式,即補碼。為什麼補碼這麼巧妙實現了正負數的加減運算?參見維基百科 補...