數(shù)據(jù)寬度和字節(jié)序
數(shù)據(jù)的寬度
數(shù)據(jù)的寬度是指數(shù)據(jù)在存儲(chǔ)器中存儲(chǔ)的尺寸。在計(jì)算機(jī)中,所有數(shù)據(jù)的基本存儲(chǔ)單位都是字節(jié)(byte),每個(gè)字節(jié)占8個(gè)位(位是計(jì)算機(jī)存儲(chǔ)的最小單位,而不是基本單位,因?yàn)樵诖鎯?chǔ)數(shù)據(jù)時(shí)幾乎沒有按位進(jìn)行存儲(chǔ)的)。其他的存儲(chǔ)單位還有字(word)、雙字(dword)和八字節(jié)(qword)。
在計(jì)算機(jī)編程中,常用的幾個(gè)重要數(shù)據(jù)存儲(chǔ)單位分別就是byte、word和dword,這幾個(gè)存儲(chǔ)單位。
單位 | 所占位數(shù) | 所占字節(jié)數(shù) |
字節(jié)(byte) | 8位 | 1字節(jié) |
字(word) | 16位 | 2字節(jié) |
雙字(dword) | 32位 | 4字節(jié) |
八字節(jié)(qword) | 64位 | 8字節(jié) |
數(shù)值的表示范圍
在計(jì)算機(jī)中存儲(chǔ)數(shù)值時(shí),也是要依據(jù)前面的數(shù)據(jù)寬度進(jìn)行存儲(chǔ)的,那么在存儲(chǔ)數(shù)據(jù)時(shí)由于存儲(chǔ)數(shù)據(jù)的寬度限制,數(shù)值的表示也是有范圍限制的。那么byte、word 和dword能存儲(chǔ)多少數(shù)據(jù)呢?我們先來(lái)計(jì)算一下,如果按位存儲(chǔ)的話,能存儲(chǔ)多少個(gè)數(shù)據(jù),再分別來(lái)計(jì)算以上三種單位能夠存儲(chǔ)的數(shù)值的范圍。
計(jì)算機(jī)使用二進(jìn)制進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí),一位二進(jìn)制最多能表示幾個(gè)數(shù)呢?因?yàn)槭嵌M(jìn)制數(shù),只存在0和1兩個(gè)數(shù),所以一位二進(jìn)制數(shù)最多能表示兩個(gè)數(shù),分別是0和1。那么,兩位二進(jìn)制最多能表示幾個(gè)數(shù)呢?因?yàn)橐晃欢M(jìn)制數(shù)能表示兩個(gè)數(shù),所以兩位二進(jìn)制數(shù)則能表示2的2次方個(gè)數(shù),即4個(gè)數(shù),分別是0、1、10、11。進(jìn)一步地,三位二進(jìn)制數(shù)能表示的就是2的3次方個(gè)數(shù),即8個(gè)數(shù),分別是0、1、10、11、100、101、110、111。
存儲(chǔ)單位 | 十進(jìn)制范圍 | 十六進(jìn)制范圍 | 2的N次方 |
字節(jié)(byte) | 0-255 | 0-FF | 2的8次方 |
字(word) | 0-65535 | 0-FFFF | 2的16次方 |
雙字(dword) | 0-4294967295 | 0-FFFFFFFF | 2的32次方 |
2的8次方是256,為什么數(shù)值只有0~255個(gè)呢?因?yàn)橛?jì)算機(jī)計(jì)數(shù)是從0開始,從0到255同樣是256個(gè)數(shù),這里的2的8次方表示能夠表示數(shù)值的個(gè)數(shù),而不是能夠表示數(shù)值的最大的數(shù)。
這里只給出了無(wú)符號(hào)整數(shù)的表示范圍,那么什么是無(wú)符號(hào)呢?數(shù)值分為有符號(hào)數(shù)和無(wú)符號(hào)數(shù),有符號(hào)數(shù)是分整數(shù)和負(fù)數(shù)的,而無(wú)符號(hào)數(shù)值有整數(shù)沒有負(fù)數(shù)。負(fù)數(shù)在計(jì)算機(jī)中的表示有符號(hào)數(shù)時(shí)借助了最高位來(lái)進(jìn)行,如果最高位是0,那么就是整數(shù),如果最高位是1則是負(fù)數(shù)。關(guān)于有符號(hào)數(shù)和無(wú)符號(hào)數(shù)不必過(guò)多地糾結(jié),因?yàn)橛?jì)算機(jī)表示數(shù)據(jù)是不區(qū)分有符號(hào)還是無(wú)符號(hào)的,有符號(hào)還是無(wú)符號(hào)是人在進(jìn)行區(qū)分。
有符號(hào)數(shù)和無(wú)符號(hào)數(shù)
數(shù)學(xué)中的數(shù)據(jù)分為正數(shù)和負(fù)數(shù),在計(jì)算機(jī)中我們分為無(wú)符號(hào)數(shù)和有符號(hào)數(shù),無(wú)符號(hào)數(shù)表示全是正數(shù),有符號(hào)數(shù)表示有正數(shù)和負(fù)數(shù)。這里好比將容器貼個(gè)標(biāo)簽,將它貼上“無(wú)符號(hào)數(shù)”的標(biāo)簽,那么它里面都是正數(shù)。如果它的標(biāo)簽是“有符號(hào)數(shù)”,那么它里面的數(shù)據(jù)可能是正數(shù)也是負(fù)數(shù)。它里面的電路數(shù)量是一定的,它能表示的開關(guān)組合也是一定的,那么它到底是按無(wú)符號(hào)數(shù)看還是有符號(hào)數(shù)看,關(guān)鍵在于它標(biāo)簽是什么。
如下圖,數(shù)據(jù)寬度為4的容器能存儲(chǔ)的數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制為“0~F”,使用一個(gè)圓球表示
無(wú)符號(hào)數(shù)表示范圍:0?1?2?3?4?5?6?7?8?9?A?B?C?D?E?F,箭頭方向表示增加方向?有符號(hào)數(shù):
正數(shù)表示范圍:0?1?2?3?4?5?6?7
負(fù)數(shù)表示范圍:-1?-2?-3?-4?-5?-6?-7?-8(從半圓F起到8,所以F表示-1,8表示-8)
無(wú)符號(hào)數(shù)不難理解,而有符號(hào)數(shù)則是從中間一分為二,左邊為負(fù)數(shù),右邊為正數(shù)。同一個(gè)圓把它看成無(wú)符號(hào)數(shù)它是一個(gè)正數(shù),如果把它看成是有符號(hào)數(shù)則是有正有負(fù)。比如F,它如果是無(wú)符號(hào)數(shù),就是15,如果是有符號(hào)數(shù)它就是-1。
字節(jié)序
字節(jié)序也稱為字節(jié)順序,在計(jì)算機(jī)中對(duì)數(shù)值的存儲(chǔ)有一定的標(biāo)準(zhǔn),而該標(biāo)準(zhǔn)隨著系統(tǒng)架構(gòu)的不同而不同。了解字節(jié)存儲(chǔ)順序?qū)τ谀嫦蚬こ淌且豁?xiàng)基礎(chǔ)知識(shí),在動(dòng)態(tài)分析程序的時(shí)候,往往需要觀察內(nèi)存數(shù)據(jù)的變化情況,這就需要我們?cè)谡莆諗?shù)據(jù)的存儲(chǔ)寬度、范圍之后,進(jìn)一步了解字節(jié)順序。
通常情況下,數(shù)值在內(nèi)存中存儲(chǔ)的方式有兩種,一種是大尾方式,另一種是小尾方式。關(guān)于字節(jié)序的知識(shí),通過(guò)一個(gè)簡(jiǎn)單的例子就可以掌握。
比如有0x01020304(C語(yǔ)言中對(duì)十六進(jìn)制數(shù)的表示方式)這樣一個(gè)數(shù)值,如果用大尾方式存儲(chǔ),其存儲(chǔ)方式為01020304,而用小尾方式進(jìn)行存儲(chǔ)則是04030201,用更直觀的方式展示其區(qū)別,如表所列。
大尾方式 | 小尾方式 | ||
數(shù)據(jù) | 地址值 | 數(shù)據(jù) | 地址值 |
01 | 00000000H | 04 | 00000000H |
02 | 00000001H | 03 | 00000001H |
03 | 00000002H | 02 | 00000002H |
04 | 00000003H | 01 | 00000003H |
從兩個(gè)地址列可以看出,地址的值都是一定的,沒有變化,而數(shù)據(jù)的存儲(chǔ)順序卻是不相同的。從表中可以得到如下結(jié)論。
大尾存儲(chǔ)方式:內(nèi)存高位地址存放數(shù)據(jù)低位字節(jié)數(shù)據(jù),內(nèi)存低位地址存放數(shù)據(jù)高位字節(jié)數(shù)據(jù);
小尾存儲(chǔ)方式:內(nèi)存高位地址存放數(shù)據(jù)高位字節(jié)數(shù)據(jù),內(nèi)存低位地進(jìn)存放數(shù)據(jù)低位字節(jié)數(shù)據(jù)。
通常情況下,Windows操作系統(tǒng)兼容的CPU為小尾存儲(chǔ)方式,而Unix操作系統(tǒng)兼容的CPU多為大尾存儲(chǔ)方式。在網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)的字節(jié)順序使用的是大尾存儲(chǔ)方式。