關於「一個字等於多少位元組?「的問題解答

2020-08-11 18:04:54

網上有人說這個問法不嚴謹,我覺得嚴格說確實是這樣,但是我個人覺得不能這樣說!

舉個例子,這個問題就好比你上初中的時候那些證明題很多其實是很不嚴謹的,但是限於知識體系,到高中你會發現好像不是那麼一回事,到了大學你又會發現另外新的東西!但是你能回去說初中老師教的都是錯的嗎?我覺得不能吧!只能說你看待問題的角度以及一個系統的宏觀視角的更深入了,看待問題更明白了!

回到這個問題,一個字等於多少位元組?

首先一個位元組等於八位這是毋庸置疑的,因爲儲存系統邏輯地址的編址便是以位元組爲單位進行編址的,計算機運算二進制這是人所共知的事,也就是8個二進制位等於1個位元組大小

這裏可能大部分人會回答,一個字等於兩個位元組,你能說這有錯誤嗎?我覺得不能

爲什麼我說不能?

首先我先分析一下說這句話錯誤的原因是什麼?

關鍵字:計算機系統

現在市場上基本上大部分都是intel系列的cpu,intel推出的x86(32位元)架構以及x64(64),這裏談到的64位元和32位元就是64個二進制位和32個二進制位,這個是CPU產商也就是intel等公司生成CPU時決定的,64位元代表他的CPU匯流排以及暫存器的數據寬度,64位元即8個位元組大小,同理32位元也是一樣的道理,

在計算機系統裡,字長是CPU的主要技術指標之一,指的是CPU一次能並行處理的二進制位數,所以這裏這裏的字大小會根據cpu架構的不同而不同,即上述說的32位元和64位元都可以表示位一個字長大小,這表徵的是一個系統,cpu處理數據的能力

所以,從計算機系統視角來看,等於兩個位元組顯然是錯誤的。

再來分析這句話正確的原因?

關鍵字:計算機語言

c語言
有人可能會很疑惑在widnows下,WORDDWORD永遠表示2位元組和4位元組大小,這裏我要強調一下,你在進行的是windows程式設計,也就是你一定匯入了Windows.h標頭檔案,不然你不可能使用上WORDDWORD
在这里插入图片描述
實際上這裏WORDDWORD的只是Windows.h標頭檔案裡的使用typedef一個別名定義,因爲在Windows下很多系統API都是使用這兩個定義的
在这里插入图片描述
DWORD真正的原型是unsigned longWORD則爲unsigned short這裏首先看清了WORD和DWORD的真面目,其次我要強調這個裡的WORD字大小和計算機系統裡的字長大小所表徵的不是同一個東西!這裏僅僅是微軟自己定義的一個東西而已,你完成可以看到有WORD的地方,直接替換成unsigned short,沒有任何疑問,也不可能有任何錯誤!

這裏順便看一下c語言下幾種數據型別大小
在这里插入图片描述
我這是在微軟的msvc編譯環境下展示的大小,即short代表2個位元組,int代表4位元組,long代表4位元組, long long代表8個位元組,不管是32位元還是64位元都是同樣的大小。

然而在gcc編譯後,long型別在32位元環境下爲4位元組大小,在64位元環境下爲8位元組大小。
在这里插入图片描述
總結,針對c語言型別,這裏沒有字大小的概念,只有short型別,唯一出現的在微軟的msvc編譯環境下的WORD是微軟自己定義的一個別名,實際爲unsigned short型別。

彙編語言

這裏可能你就看到很多WORD了

  1. 僞指令
    在这里插入图片描述
DB 定義位元組變數
DW 定義字變數,2位元組大小
DD 定義4位元組變數
DQ 定義8位元組變數
DT 定義10位元組變數
  1. 彙編指令中
    在这里插入图片描述
    這裏就是真正的所謂的大家經常說到的一個字等於兩個位元組大小的地方了,在intel彙編中是這樣。
BYTE(位元組) 1位元組
WORD(字) 2位元組
DWORD(雙字) 4位元組
QWORD(四字)8位元組
TBYTE(十位元組)10位元組

下圖是我在arm指令的書籍上面看到的描述,字數據大小,這裏所謂的字大小就是這本書針對的ARM32位元系統說的,實際上也就是4個位元組大小的數據。
在这里插入图片描述

最後總結

關於一個字等於多少位元組這個問題?是需要物件導向回答的,如果對於計算機系統而言,字大小也就是所謂的字長是表徵計算機系統處理問題的能力,通常等於cpu匯流排或者暫存器的寬度,即現代計算的32位元或者64位元;在windows下程式設計,而且使用的微軟的msvc編譯環境,微軟定義的WORD本質爲unsigned short型別,只是一個別名;如果在彙編語言裏面,一個字大小確實等於2個位元組大小,DW則爲數據定義僞指令,定義爲一個字大小。