整数的无符号编码和有符号编码
單個的位沒有實際意義,加上解釋才有實際意義.我們可以把位組合在一起,并且加上解釋以此賦予它意義.
無符號編碼表示的數(shù) x >= 0
有符號編碼表示的數(shù) ? min ?<= x ?and x <= max
當我們對數(shù)字的運算超出編碼所能表示的范圍就叫做溢出.
大多數(shù)計算機使用8位的塊(字節(jié))作為最小的可尋址單位.機器級程序?qū)?nèi)存視為非常大的數(shù)組,稱為虛擬內(nèi)存.內(nèi)存中的每一個字節(jié)都由唯一的數(shù)字來標識.稱為它的地址.
所有地址的集合即為虛擬地址空間.所以,對于32位的機器,虛擬地址空間地址范圍為0~0x8FFFFFFF-1,從0開始,需要減去1.
1.二進制轉(zhuǎn)16進制
? ?數(shù)學原理: 2^0+2^1+2^2+2^3 = 15
? ?在16進制中我們使用A~F來表示10,11,12,13,14,15,0~9 不變.
? ?由此,對一個二進制序列,我們只要從低位開始,每四個位取一個16進制數(shù).如下.
? ?1111 0001 ?1000 的16進制表示法為 0xF18
? ?如果最后一次取數(shù)的二進制序列少于4位,高位補0,如下
? ?11 0001 ?1000 的16進制表示法為 0x318
? ?特別當x = 2^n次方時,轉(zhuǎn)16進制方法如下.
? ?因為有16進制的0代表4個二進制位.所以n = i + 4j. i = 0,1,2,3,16進制表示法為0x(2^i)(j個0)
? ?比如 二進制序列 100 0000 是 2^6, 6 = 2+1*4,16進制表示法為0x40?
?
?2.16進制轉(zhuǎn)二進制
? ? 每一個16進制數(shù),寫成4個二進制位
? ? 比如.0x7F ? ?0111 1111 ??
? ?
對于一個多字節(jié)的程序?qū)ο?必須建立倆個規(guī)則,對象的地址是什么,內(nèi)存中如何排列這些字節(jié),假設4字節(jié)int變量0x7FFFFFFF存儲是連續(xù)的,
有倆種排列方式.
1.低位在前
0x00 ? int的第一個字節(jié) FF
0x01 ? int的第二個字節(jié) FF
0x02 ? int的第三個字節(jié) FF
0x03 ? int的第四個字節(jié) 7F
2.高位在前
0x00 ? int的第四個字節(jié) 7F
0x01 ? int的第三個字節(jié) FF
0x02 ? int的第二個字節(jié) FF
0x03 ? int的第一個字節(jié) FF
?由此我們導出倆種程序?qū)ο笤趦?nèi)存中排列的方式,大端法,小端法
1.有效的低字節(jié)在前,小端法
2.有效的高字節(jié)在前.大端法
影響到三個方面.
1.跨主機傳送數(shù)據(jù),比如從使用大端排列的機器傳輸字節(jié)到小端排列的機器.如下,假設要傳送的數(shù)據(jù)是4個字節(jié)的int數(shù)字,0x7FFFFFFF(人的書寫形式),即2147483647
? ?大端機器的操作如下,將此int的四個字節(jié),存入到一個bye[4]的數(shù)組內(nèi).[7F,FF,FF,FF,FF,FF,FF],
? ?小端機器接受到數(shù)據(jù)如下.[7F,FF,FF,FF,FF,FF,FF],那么小端機器認為低字節(jié)在前,即傳輸過來的數(shù)字為0xFFFFFFF7F.
2.閱讀表示整數(shù)數(shù)據(jù)的字節(jié)序列時字節(jié)順序也很重要.如下,考慮到反匯編代碼
? 01 05 43 0b 20 00,這個是我們的書寫順序.
小端機器解釋的順序為 00 20 0b 43 05 01
大端機器解釋的順序為 01 05 43 0b 20 00
3.編寫規(guī)避正常類型系統(tǒng)的程序時,比如C里面的強制轉(zhuǎn)換和union
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
無符號數(shù)編碼和有符號整數(shù)補碼編碼
設一個二進制序列[xw-1.........x0]
? ?無符號編碼,最高位為負權(quán),即符號位:
? ? ?X1 = xw-1*2w-1+..........+x0*20
? 有符號補碼編碼為:
? ? X2 = -xw-1*2w-1+xw-2*2w-2+......................+x0*20
由以上倆個數(shù)學公式,可以導出有符號補碼編碼整數(shù)轉(zhuǎn)無符號編碼整數(shù)公式
? X2-X1 = -xw-1?* 2w-1?- ?xw-1*2w-1 = -xw-1*2w
即 X1 = X2 + xw-1*2w ? ?X2 = X1 -?xw-1*2w
設,w = 4,考慮如下一個二進制序列[ 1 0 1 1]
它的無符號整數(shù)為 8+2+1=11,有符號整數(shù)為 -8+3=-5,
有 -5 = 11 - 1*2^4=11-16=-5
有 11 = -5 + 2^4 = -5 + 16 = 11
對倆個整數(shù)相加溢出,即超出編碼能容納的范圍,
無符號數(shù)加法
x +y = x+y 或者 x + y - 2w(即溢出位舍棄),考慮如下代碼
#include <iostream> #include<limits.h> using namespace std;int main() {cout << UINT32_MAX + 1 << endl; }運行結(jié)果為0.原理如下
0xFFFFFFFF + 1 = 0x1 00000000,溢出舍棄,即0x00000000 =?0x1 00000000 - 2^32 = 2^32 - 2^32
有符號數(shù)補碼加法
x + y = x +y 或者 x+y - 2w?(正溢出,整數(shù)相加變成負數(shù)) 或者 x+y + 2w?(負數(shù)相加變成整數(shù))
int main() {cout << INT32_MAX + 1 << endl; //2147483647 + 1 = 2147483648 - 2^32 = -2147483648 cout << INT32_MIN - 1 << endl; // -2147483648 - 1 = -2147483649 + 2^32 = 2147483647 }INT32_MAX 是 0x7FFFFFFF + 1 = 0x80000000 - 0x1 00000000 (2^32) = 0x80000000,第二行同理?
?
posted on 2018-10-07 16:16 好吧,就是菜菜 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/shuiyonglewodezzzzz/p/9750381.html
總結(jié)
以上是生活随笔為你收集整理的整数的无符号编码和有符号编码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用FFmpeg进行视频抽取音频,之后进
- 下一篇: MyBatis拦截器原理探究MyBati