C語言中大小端問題實例探索解決方法
一、什么是大小端
大端模式:就是高位字節(jié)數(shù)據(jù)存放在內(nèi)存的低地址端,低位字節(jié)數(shù)據(jù)存放在內(nèi)存的高地址端。
小端模式:就是低位字節(jié)數(shù)據(jù)存放在內(nèi)存的低地址端,高位字節(jié)數(shù)據(jù)存放在內(nèi)存的高地址端。
【大端】和【小端】表示多字節(jié)值的哪一端存儲在該值的起始地址處;
二、舉個例子
#include<stdio.h> int main() { int a = 1; return 0; }
調(diào)試運行一下,打開內(nèi)存監(jiān)視窗口,發(fā)現(xiàn)定義的這個int類型的變量a(int a = 1)為4個字節(jié),轉(zhuǎn)換成bit是32位,所以電腦中存儲的變量a為二進(jìn)制表示00000000 00000000 00000000 00000001,vs2019中的監(jiān)視此時表示的16進(jìn)制,也就是0x00 00 00 01。但是看看VS2019里面所顯示的是不是就有點懵了,a這個變量值是1 ,在內(nèi)存中存儲應(yīng)該是0x 00 00 00 01,為什么編譯器給出的卻是0x 01 00 00 00呢?提到這個問題就要說說大小端問題了??????!?。?!
三、大小端演示
按照不同模式將a保存在內(nèi)存中,情況如下:
補充:結(jié)合高位字節(jié),低位字節(jié)與大小端進(jìn)行比較理解
當(dāng)向內(nèi)存中存放一個數(shù)據(jù)的時候,會從內(nèi)存的高地址開始往低地址的方向放這個數(shù)據(jù),但是放數(shù)據(jù)的時候就是按照我們?nèi)藶榈倪@種認(rèn)識往里面存放嗎?比如向內(nèi)存中放一個數(shù)據(jù)0x11 22 33 44,計算機就是把這個數(shù)字送到內(nèi)存后,這個時候內(nèi)存中數(shù)據(jù)放的樣式就是我們輸入的這樣嗎?其實真正向內(nèi)存存儲的時候,由于內(nèi)存選擇了不同的兩種(大端、小端)存儲模式,內(nèi)部真正存放的樣式就跟我們想的不一樣了。但是人們聰明啊,把自己認(rèn)為的這種順序規(guī)定了是從高位字節(jié)到低位字節(jié)的。即一個確定的數(shù)字,從左往右,就是從高位字節(jié)到低位字節(jié),可以說這是一種一致認(rèn)為的習(xí)慣說法。
這樣區(qū)分大小端就是按照字節(jié)位與地址大小比較來確定。
四、解釋"二"中舉例的問題
那么剛剛VS2019中的問題就可以講的通了,在VS2019中,數(shù)據(jù)往內(nèi)存中存放是由高地址到低地址的,由于存儲方式是小端存儲模式,所以先往里放高位字節(jié)的內(nèi)容,即對于0x12345678來說,從高地址往低地址存放時,放入順序就如圖a所示。然后由于操作系統(tǒng)在訪問內(nèi)存數(shù)據(jù)時是從低地址向高地址的順序進(jìn)行的,所以最后顯示的存放就如圖b所示
五、怎么判斷是大端還是小端
int check_sys() { int a = 1; return *(char*)&a; } int main() { int ret = check_sys(); if( ret == 1 ) printf("小端\n"); else printf("大端\n"); return 0; }
六、一個題目
在小端機器中,下面代碼輸出的結(jié)果是:( )
A.00223344
B.0
C.11223300
D.112233
#include <stdio.h> int main() { int a = 0x11223344; char *pc = (char*)&a; *pc = 0; printf("%x\n", a); return 0; }
解析:
假設(shè),a變量的地址為0x64,則a變量在內(nèi)存中的模型為:
0x64| 44 |
0x65| 33 |
0x66| 22 |
0x67| 11 |
char*類型的指針變量pc指向只能指向字符類型的空間,如果是非char類型的空間,必須要將該空間的地址強轉(zhuǎn)為char*類型。
char *pc = (char*)&a; pc實際指向的是整形變量a的空間,即pc的內(nèi)容為0x64,即44,
*pc=0,即將44位置中內(nèi)容改為0,修改完成之后,a中內(nèi)容為:0x11223300
因此:選擇C
到此這篇關(guān)于C語言中大小端問題實例探索解決方法的文章就介紹到這了,更多相關(guān)C語言大小端內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Qt實現(xiàn)C/C++調(diào)用Matlab函數(shù)全過程
這篇文章給大家詳細(xì)介紹了基于Qt平臺實現(xiàn)C/C++調(diào)用Matlab函數(shù)全流程,文中通過圖文和代碼示例給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01