轉載https://www.cnblogs.com/wxb20/p/6033458.htmljavascript
這篇文章主要介紹了十進制負數轉換爲二進制、八進制、十六進制的知識分享,須要的朋友能夠參考下php
程序猿們或許對二進制都不陌生,二進制是計算技術中普遍採用的一種數制。二進制數據是用0和1兩個數碼來表示的數。可是不少人都會將二進制轉換成整數,可是如何用二進制表示負數呢?有的人會說,在二進制前面加個負數符合。而計算機只能認識0 和 1,又怎麼去加個額外的負數符號呢?因而咱們就須要用0和1來表示負數。若是想要弄懂這個,咱們須要先了解什麼是二進制原碼。html
原碼是什麼原碼(true form)是一種計算機中對數字的二進制定點表示方法。原碼錶示法在數值前面增長了一位符號位(即最高位爲符號位):正數該位爲0,負數該位爲1(0有兩種表示:+0和-0),其他位表示數值的大小。java
簡單直觀;例如,咱們用8位二進制表示一個數,+11的原碼爲00001011,-11的原碼就是10001011程序員
原碼不能直接參加運算,可能會出錯。例如數學上,1+(-1)=0,而在二進制中00000001 + 10000001 = 10000010,換算成十進制爲-2。顯然出錯了。app
二進制原碼、補碼和反碼spa
咱們如何把十進制的-3,轉換成二進制表示呢?首先咱們將 -3 的絕對值 +3 轉換成二進制,假設是爲int類型(32位)的,那麼二進制表示爲:.net
0000 0000 0000 0000 0000 0000 0000 0011
負數轉換成二進制分爲3步:orm
一、 首先將負數轉換爲對應的原碼htm
-3 的原碼爲(也就是+3轉換成二進制後的字符串):
0000 0000 0000 0000 0000 0000 0000 0011
二、 再將原碼的每一位作取反操做獲得反碼。
取反操做:0變爲1 、 1變爲0;取反後的結果即爲:
1111 1111 1111 1111 1111 1111 1111 1100
三、 將反碼+1獲得補碼
1111 1111 1111 1111 1111 1111 1111 1101
如今用Windows自帶的計算器來驗證一下,Win+R 輸入calc,將計算器改成程序員,選擇雙字(4字節,32位)
打開Windows自帶的計算器科學計算功能
在計算器中選擇十進制,以後輸入 -3 :
Windows自帶的計算器科學計算十進制下輸入-3
再點擊二進制轉換,將十進制下的-3轉換成二進制:
轉換十進制-3爲二進制
二進制轉十進制負數問題正常狀況下,轉換二進制到十進制都是沒有任何問題的。而在相似 JavaScript / PHP 等整數類型中,通常 int /integer 都有位數限制,通常都是32位長度。也就預示着,這些語言中,整數是有最大值的,而32位最大整數極限爲:2147483647,也就是二進制:
01111111111111111111111111111111
那麼就很容易理解,32位二進制,第一位數爲0的時候,就表示這個是一個正數,而若是是1,那麼就表示這個是負數。
32位二進制 11111111111111111111111111111001 十進制值是什麼?
11111111111111111111111111111001
如上,二進制長度爲32位,也就是這個整數是一個負數,先取反,獲得反碼:
00000000000000000000000000000110
反碼+1,獲得:
00000000000000000000000000000111
轉換成十進制:7
因爲是負數,因此加個負號,轉換成 -7
趣味:32位二進制 1111111111111111111111111111001 十進制值是什麼?
這個是個比較有趣的,千萬不要誤導爲上面這是一個負數,其實這個是個整數,由於這裏只有31位,須要在前面加0,補足32位,變成:
01111111111111111111111111111001
十進制負數轉八進制、十六進制
負數轉換成八進制、十六進制,只需在補碼(二進制)的基礎上,3位合成一位計算,或者4位合成一位計算
-3的轉換成二進制爲:
1111 1111 1111 1111 1111 1111 1111 1101
八進制則將-3的二進制從右至左每3位爲一個單元,不夠三位用0補 即:
011 111 111 111 111 111 111 111 111 111 101
計算每個單元,結果爲:37777777775
十六進制則將-3的二進制從右至左每4位合併爲一個單元,即:
1111 1111 1111 1111 1111 1111 1111 1101
計算後爲: FFFFFFFD
轉換十進制-3爲八進制和十六進制