1. 程式人生 > >定址和位元組順序

定址和位元組順序

當我們遇到跨多位元組的程式物件時,這時候就需要判定清楚兩個問題,一個是物件的地址,另外一個是儲存器的位元組排列情況。

int x=0x1234567,位於地址0x100處:

位元組的排列不同的機器有著大端和小端之分,在不同型別的機器之間通過網路傳送二進位制資料時,接收程式字裡的位元組可能會出現反序排列,這時,網路應用程式的程式碼必須得遵守一定的位元組順序規則。

下面是一段位元組表示的示例:

#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start,int len){

              int i;
              for(i=0;i<len;i++)
                 printf("%.2x",start[i]);
              printf("\n");
    }

void show_int(int x){
              show_bytes((byte_pointer)&x,sizeof(int));

   }



void show_pointer(void *x){
              show_bytes((byte_pointer)&x,sizeof(void *));

   }

void test_show_bytes(int val){
        int ival=val;
        int *pval=&ival;
        show_int(ival);
        show_pointer(pval);
  }
int main(){
      //test_show_bytes(12345);
      printf("\n");
      test_show_bytes(0x00003039);
      printf("\n");
      test_show_bytes(0x87654321);
  }

執行結果:

$ ./show-bytes

39300000
a43aecfeff7f0000

21436587
a43aecfeff7f0000

執行機器是在Linux 64上,最低有效位元組值先輸出,這說明是小端法機器。值得注意的是Linux 64不同於Linux 32的4位元組地址,它是8位元組地址,所以是8位元組的輸出。

這時候問題來了,為何不同的整型輸入,得到的卻是相同的指標地址。

相關推薦

深入理解計算機系統——2.1.4位元組順序

對於跨越多位元組的程式物件,我們必須建立兩個規則: 這個物件的地址是什麼?儲存器如何排列這些位元組? 在幾乎所有的機器上,多位元組物件被儲存為連續的位元組序列, 物件的地址為所使用的整個位元組中首地址(最小地址)。 例如:一個int 的變數X的地址為0x100, 那

位元組順序

當我們遇到跨多位元組的程式物件時,這時候就需要判定清楚兩個問題,一個是物件的地址,另外一個是儲存器的位元組排列情況。int x=0x1234567,位於地址0x100處:位元組的排列不同的機器有著大端和小端之分,在不同型別的機器之間通過網路傳送二進位制資料時,接收程式字裡的位

對於按字位元組的理解

按字定址:最通俗的理解就是一組地址線的每個不同狀態對應一個字的地址。因為位元組是計算機中最基本的計量單位且一個字由若干位元組構成,所以計算機在定址過程中會區分字裡面的位元組,即會給字裡面的位元組編址,這樣就會佔用部分地址線。比如說有24根地址線,按字定址,字長16位,16位即兩個位元組,這樣就會佔用一根地址線

位元組按字

百度知道上有這麼一個問題: 組成原理唐書上73頁: 對24位地址線的主存,字長為32位,按位元組定址的範圍是16M,按字定址的範圍為4M。 但書前面講的是暫存器mar的位數反映了儲存單元的個數 那樣的話:按字定址的範圍是16M=2^24 按位元組定址的範圍是16M*4=64

按字位元組以及記憶體編碼、地址匯流排與資料匯流排的理解

記憶體編制和關於按字定址和按位元組定址的理解:在很多書上都看到32位地址線的定址空間是4G,我的理解是32位不就是32bit嗎,2^32Bit=4GB/8=0.5GB,為什麼會是4G呢?這裡其實設計到一個概念,就是記憶體編址的問題。32位地址線的定址範圍為什麼是4G?2^30

關於按字位元組的理解

我們先從一道簡單的問題說起! 設有一個1MB容量的儲存器,字長32位,問:按位元組編址,字編址的定址範圍以及各自的定址範圍大小? *如果按位元組編址,則* 1MB = 2^20B

按字位元組問題!

本人理解、      按字定址,即兩個位元組時,2^1=2   需要調出一根地址線用於儲存單元內部定址,故地址線變為19根用來尋儲存單元,所以2^19=512K           按位元組時,只有一個位元組,而2^0=1,所以全部地址線用來尋儲存單元,故為 2^20=1M            不知道對否

硬碟分割槽、系統啟動過程

硬碟物理結構 先看下硬碟物理結構 1 硬碟物理結構 硬碟物理上主要是碟片、機械手臂、磁頭、和主軸等組成。在碟片邏輯劃分上又分為磁軌、扇區,例如下圖: 2 碟片磁軌、扇區 磁軌: 當硬碟碟片旋轉時,磁頭若保持在一個位置上,則磁頭會在碟片表面劃出一個圓形軌跡

.NET(C#):字元編碼(Encoding)位元組順序標記(BOM)

什麼是字元順序標記(BOM) 計算機內部資料儲存都是二進位制的,只有知道一段資料的二進位制儲存格式,這段資料才有意義。所謂的文字檔案其實就是用一種特定的字元編碼來將二進位制源資料轉換成文字。多數文字編輯器都可以編輯不同編碼的文字檔案,那麼文字編輯器是怎樣通過源二

硬碟分割槽、系統啟動過程(轉)

前言筆記: 為了遮蔽複雜的硬體細節,現代的磁碟普遍使用一種叫做LBA(Logical Block Address)的方式,即整個磁碟中所有的扇區從0開始編號,一直到最後一個扇區,這個扇區編號叫做邏輯扇區號。邏輯扇區號拋棄了所有複雜的磁軌、盤面之類的概念。當我們給出一個邏

按字位元組

考研複習,複習計算機組成原理時,看到儲存器時對於主存的按字定址,按位元組定址不怎麼明白了,畢竟是一年前學的課程。好多東西都忘了,整了好久才弄明白。以下是我的一些個人看法。   先說說字和位元組  在計算機中是8位一個位元組。 說字長16位時,16位是兩個位元組 所以32位就是4個位

【TCP/IP】IP:網際協議(路由)

IP是TCP/IP協議族中最為核心的協議,所有的TCP、UDP、ICMP及IGMP資料都以IP資料報格式傳輸。 IP提供不可靠、無連線的資料報傳送服務。 不可靠是指它不能保證IP資料報能成功地到達目的地,IP僅提供最好的傳輸服務,如果期間資料傳輸發生了錯誤,IP的處理演算法

[組合語言]立即數暫存器

1. 什麼是立即數? 運算元從指令程式碼中得到,即立即數(Immediate),也可以說就是指令的一部分了, 例如: MOV EAX 33221100H ;機器程式碼為 B8 00 11 22 33 ;操作碼為 B8 ;立即數為 33221100 操作

ceph radosgw 物件元資料組織

1. 物件定址 rgw物件定址的過程就是“拼接物件串“的過程,再結合bucket.pool就能對應到rados物件。 1.1 普通物件 1.2 multipart 物件 1.3 非multipart versioned物件 1.4 multipart version

AT&T彙編心得之間接LEA指令

AT&T彙編心得(1)定址方式:0x4(%esp)的操作是把暫存器esp中的值取出,然後加上4,得到的值作為地址,間接定址得到需要的資料例如:pushl -0x4(%ecx)該指令的含義是取出暫存器ecx的值,減去4,將得到的值作為地址,在記憶體找到該地址對應的值,將

Hbase讀寫流程機制

寫操作流程 (1) Client通過Zookeeper的排程,向RegionServer發出寫資料請求,在Region中寫資料。 (2) 資料被寫入Region的MemStore,直到MemStore達到預設閾值。 (3) MemStore中的資料被Flush成一個StoreFile。 (4) 隨著S

位元組順序:高位優先(big-endian)低位優先(little-endian)

@[TOC](位元組順序:高位優先(big-endian)和低位優先(little-endian)) 網路位元組序: MSB 高位元組前存法 Most Significant Bit (Big Edian) 主機位元組序: LSB 低位元組前存法 Lest

MIPS的暫存器、指令方式的分類

MIPS的32個暫存器 助記符 編號 作用 zero 0 恆為0 at 1 (assembly temporary)保留給彙編器使用 v0,v1 2-3

鏈地址法開放法,求等概率下查詢成功時的平均查詢長度

問題描述: 演算法與資料結構的一個題目,用鏈地址法和開放定址法,求等概率情況下查詢成功時的平均查詢長度 已知一組關鍵字(13,20,85,52,8),雜湊函式為:H(key)=key MOD 6

mips指令分類大全

一、普及一些相關概念 指令集:一個給定的計算機體系結構所包含的指令集合。儲存程式概念:多種型別的指令和資料均以數字形式儲存於儲存器的概念,儲存程式型計算機即緣於此。1 二、MIPS運算元之32個暫存器 暫存器名字 暫存器編號 暫存器功能 $zero $0 恆等