㈠ 是不是大多數電腦的主機位元組序都是小端的
普通人用的桌面電腦,只要是Intel或AMD的x86/x64架構就一定是小端位元組序。
外很多ARM
CPU可以選擇數據指令位元組序,不過通常也都是運行小端位元組序(比如我們的智能手機)。
網路設備,像PowerPC核心的一些路由器,默認運行大端位元組序。
㈡ 計算機硬體為什麼要區分位元組序
一、位元組序定義
位元組序,顧名思義位元組的順序,再多說兩句就是大於一個位元組類型的數據在內存中的存放順序(一個位元組的數據當然就無需談順序的問題了)。
其實大部分人在實際的開發中都很少會直接和位元組序打交道。唯有在跨平台以及網路程序中位元組序才是一個應該被考慮的問題。
在所有的介紹位元組序的文章中都會提到位元組序分為兩類:Big-Endian和Little-Endian。引用標準的Big-Endian和Little-Endian的定義如下:
a) Little-Endian就是低位位元組排放在內存的低地址端,高位位元組排放在內存的高地址端。
b) Big-Endian就是高位位元組排放在內存的低地址端,低位位元組排放在內存的高地址端。
c) 網路位元組序:4個位元組的32 bit值以下面的次序傳輸:首先是0~7bit,其次8~15bit,然後16~23bit,最後是24~31bit。這種傳輸次序稱作大端位元組序。由於TCP/IP首部中所有的二進制整數在網路中傳輸時都要求以這種次序,因此它又稱作網路位元組序。比如,乙太網頭部中2位元組的「乙太網幀類型」,表示後面數據的類型。對於ARP請求或應答的乙太網幀類型來說,在網路傳輸時,發送的順序是0x08,0x06。在內存中的映象如下圖所示:
棧底 (高地址)
---------------
0x06 -- 低位
0x08 -- 高位
---------------
棧頂 (低地址)
該欄位的值為0x0806。按照大端方式存放在內存中。
二、高/低地址與高低位元組
首先我們要知道我們C程序映像中內存的空間布局情況:在《C專家編程》中或者《Unix環境高級編程》中有關於內存空間布局情況的說明,大致如下圖:
----------------------- 最高內存地址 0xffffffff
| 棧底
.
. 棧
.
棧頂
-----------------------
|
|
|/
NULL (空洞)
/|
|
|
-----------------------
堆
-----------------------
未初始化的數據
----------------(統稱數據段)
初始化的數據
-----------------------
正文段(代碼段)
----------------------- 最低內存地址 0x00000000
以上圖為例如果我們在棧上分配一個unsigned char buf[4],那麼這個數組變數在棧上是如何布局的呢[注1]?看下圖:
棧底 (高地址)
----------
buf[3]
buf[2]
buf[1]
buf[0]
----------
棧頂 (低地址)
現在我們弄清了高低地址,接著來弄清高/低位元組,如果我們有一個32位無符號整型0x12345678(呵呵,恰好是把上面的那4個位元組buf看成一個整型),那麼高位是什麼,低位又是什麼呢?其實很簡單。在十進制中我們都說靠左邊的是高位,靠右邊的是低位,在其他進制也是如此。就拿0x12345678來說,從高位到低位的位元組依次是0x12、0x34、0x56和0x78。
高低地址和高低位元組都弄清了。我們再來回顧一下Big-Endian和Little-Endian的定義,並用圖示說明兩種位元組序:
以unsigned int value = 0x12345678為例,分別看看在兩種位元組序下其存儲情況,我們可以用unsigned char buf[4]來表示value:
Big-Endian: 低地址存放高位,如下圖:
棧底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
棧頂 (低地址)
Little-Endian: 低地址存放低位,如下圖:
棧底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
---------------
棧頂 (低地址)
在現有的平台上Intel的X86採用的是Little-Endian,而像Sun的SPARC採用的就是Big-Endian。
㈢ 字元串在小位元組序計算機中是按什麼順序存儲的
也依然是按照位元組順序存儲的,例如字元串「abc」在內存中的連續四個位元組分別是0x61、0x62、0x63、0x00。
網路嫌我字數不夠
㈣ 什麼是電腦的十進制
電腦採用的是二進制,不是十進制。
十進制基於位進制和十進位兩條原則,即所有的數字都用10個基本的符號表示,滿十進一,同時同一個符號在不同位置上所表示的數值不同,符號的位置非常重要。
人類算數採用十進制,可能跟人類有十根手指有關。亞里士多德稱人類普遍使用十進制,只不過是絕大多數人生來就有10根手指這樣一個解剖學事實的結果。
(4)電腦一般用什麼位元組序擴展閱讀
十進制的歷史
有學者認為,北京周口店的一萬多年前的山頂洞人遺址出土的骨管,以一個圓點代表1,兩個圓點並列代表2,三個圓點並列代表3,五個圓點上二下三排列代表5,長圓形可能代表十。中國著名數學史家,國際科學史研究院通訊院士李迪教授認為山頂洞人骨管符號是「一種十進制思想」。
另有學者對中國青海樂都縣柳灣出土一千多枚新石器時代骨片進行研究,發現它們分屬馬廠、半山、齊家和辛店四個中文化型。骨片長度為2-2.4厘米,厚約1毫米。骨片上有刻痕,少的一個,多不超過八個,每個骨片上的刻痕數目不超過十個,他們以此認為新石器時代已有加法運算和十進制。
㈤ [單選題] 計算機中位元組是常用單位,它的英文名字是____。
Byte
位元組(Byte)是計算機信息技術用於計量存儲容量的一種計量單位,也表示一些計算機編程語言中的數據類型和語言字元。
一個位元組存儲8位無符號數,儲存的數值范圍為0-255。如同字元一樣,位元組型態的變數只需要用一個位元組(8位元)的內存空間儲存。
(5)電腦一般用什麼位元組序擴展閱讀
位元組(Byte)=8位(bit)
1KB( Kilobyte,千位元組)=1024B
1MB( Megabyte,兆位元組)=1024KB
1GB( Gigabyte,吉位元組,千兆)=1024MB
1TB( Trillionbyte,萬億位元組,太位元組)=1024GB
1PB( Petabyte,千萬億位元組,拍位元組)=1024TB
1EB( Exabyte,百億億位元組,艾位元組)=1024PB
1 ZB(Zettabyte,十萬億億位元組,澤位元組)=1024EB
1YB( Yottabyte,一億億億位元組,堯位元組)=1024ZB
㈥ 用宏判斷計算機處理器是大端位元組序(Big-Endian)還是小端位元組序(Little-Endian)
實現同樣的功能,我們來看看Linux 操作系統中相關的源代碼是怎麼做的:
static union { char c[4]; unsigned long mylong; } endian_test = {{ 'l', '?', '?', 'b' } };
#define ENDIANNESS ((char)endian_test.mylong)
Linux 的內核作者們僅僅用一個union 變數和一個簡單的宏定義就實現了一大段代碼同樣的功能!由以上一段代碼我們可以深刻領會到Linux 源代碼的精妙之處!(如果ENDIANNESS=』l』表示系統為little endian,
為』b』表示big endian )
http://blog.chinaunix.net/uid-25367385-id-188322.html
㈦ 如何寫程序判斷自己電腦是大端位元組序還是小端位元組序
Java編譯後.class文件是二進制位元組碼,而不是系統能識別的機器碼,所以直接運行.class文件,系統不能識別,而Java為了解決這個問題,採用一個中間轉換過程,必須要把.class文件,轉換成對應操作系統所能識別的機器碼。 於是把這個轉換的任務交給了JVM(java虛擬機),所以只要安裝虛擬機的操作系統就能運行Java開發的程序,而不管你用的什麼操作系統,因為轉換工作是由虛擬機來幫你完成的。 舉個例子:假如:你(相當於Java程序)和美國人(一種操作系統)談話,而你不懂英語,美國人不懂漢語,怎麼辦呢?你會想到找個翻譯(Java虛擬機),把你說的話翻譯成英語。 這個時候你又和一
㈧ 什麼是位元組序
小頭 (LSB):
Least Significant Bit (or Byte)
大頭 (MSB):
Most Significant Bit (or Byte)
位元組序,即位元組在電腦中存放時的序列與輸入(輸出)時的序列是先到的在前還是後到的在前。
輸入(輸出)流位元組序:
B1,B2,B3,B4,B5,B6.....
電腦中
short int a,b,c;
可能是:
a = B2 << 8 + B1;
b = B4 << 8 + B3;
c = B6 << 8 + B5;
也可能是:
a = B1 << 8 + B2;
b = B3 << 8 + B3;
c = B5 << 8 + B6;
這取決於位元組序的約定。例如GIF圖像文件中的許多定義塊中的short int 是 a = B2 << 8 + B1; ...
即B2左移8位加B1等於一個十六位的整數。