程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 大端和小端,字節對齊

大端和小端,字節對齊

編輯:關於C語言

1)Little-Endian就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。
2)Big-Endian就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。

16bit寬的數0x1234在Little-endian模式以及Big-endian模式)CPU內存中的存放方式假設從地址0x4000開始存放)為:內存地址小端模式存放內容大端模式存放內容0x40000x340x120x40010x120x34

判斷大小端的C語言程序

inti=1;
char*p=(char*)&i;
if(*p==1)
printf("LittleEndian");
else
printf("BigEndian");

需要字節對齊的根本原因在於CPU訪問數據的效率問題,系統一次訪問0-3,3-7,等地址上的數據,若一個int型數據存儲在2,3,4,5地址上,則需要訪問內存兩次,如果存在0,1,2,3地址上,則只需訪問一次內存。

1、對於一個類型的數據,它存放的起始地址只要是它的類型的大小的整數倍就行了。若inta,則a只要存放在地址0,4,8,12.。。。。等地址上即可int為4字節)。若charb,則存放在0,1,2,3,4,5,。。。任意一個地址開始的就行。若shortb,則存放在0,2,4,6,8。。。等地址上。

float為4字節,double為8字節。其實對齊問題是考慮在結構體中的,單獨定義一個變量或數組好像考慮這個意義不大。

2、結構體是按其定義的數據類型的最大的那個對齊的。

structtest
{
charx1;
charx4;
shortx2;

charx5;

};

運行後的結果sizeof(test)=6;而不是5。

0:x11:x42-3:x24:x5

地址0存儲x1地址1存儲x4地址2、3存儲x2地址4存儲x5

主要是考慮到結構體數組的問題。結構體的大小必須是其中最大變量占用空間的整數倍。

structtest
{
charx1:2;
charx4:6;

charx2:7;
charx5:4;

};

sizeof(test)=3;

若修改為

structtest
{
charx1:2;
charx4:7;

charx2:7;
charx5:4;

};

sizeof(test)=4;

只要保證同一個字符變量在一個字節上即可

本文出自 “李海川” 博客,請務必保留此出處http://lihaichuan.blog.51cto.com/498079/1304010

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved