網站首頁 編程語言 正文
一、什么是大小端
大端模式:就是高位字節數據存放在內存的低地址端,低位字節數據存放在內存的高地址端。
小端模式:就是低位字節數據存放在內存的低地址端,高位字節數據存放在內存的高地址端。
【大端】和【小端】表示多字節值的哪一端存儲在該值的起始地址處;
二、舉個例子
#include<stdio.h>
int main()
{
int a = 1;
return 0;
}
調試運行一下,打開內存監視窗口,發現定義的這個int類型的變量a(int a = 1)為4個字節,轉換成bit是32位,所以電腦中存儲的變量a為二進制表示00000000 00000000 00000000 00000001,vs2019中的監視此時表示的16進制,也就是0x00 00 00 01。但是看看VS2019里面所顯示的是不是就有點懵了,a這個變量值是1 ,在內存中存儲應該是0x 00 00 00 01,為什么編譯器給出的卻是0x 01 00 00 00呢?提到這個問題就要說說大小端問題了??????!!!!
三、大小端演示
按照不同模式將a保存在內存中,情況如下:
補充:結合高位字節,低位字節與大小端進行比較理解
當向內存中存放一個數據的時候,會從內存的高地址開始往低地址的方向放這個數據,但是放數據的時候就是按照我們人為的這種認識往里面存放嗎?比如向內存中放一個數據0x11 22 33 44,計算機就是把這個數字送到內存后,這個時候內存中數據放的樣式就是我們輸入的這樣嗎?其實真正向內存存儲的時候,由于內存選擇了不同的兩種(大端、小端)存儲模式,內部真正存放的樣式就跟我們想的不一樣了。但是人們聰明啊,把自己認為的這種順序規定了是從高位字節到低位字節的。即一個確定的數字,從左往右,就是從高位字節到低位字節,可以說這是一種一致認為的習慣說法。
這樣區分大小端就是按照字節位與地址大小比較來確定。
四、解釋"二"中舉例的問題
那么剛剛VS2019中的問題就可以講的通了,在VS2019中,數據往內存中存放是由高地址到低地址的,由于存儲方式是小端存儲模式,所以先往里放高位字節的內容,即對于0x12345678來說,從高地址往低地址存放時,放入順序就如圖a所示。然后由于操作系統在訪問內存數據時是從低地址向高地址的順序進行的,所以最后顯示的存放就如圖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;
}
六、一個題目
在小端機器中,下面代碼輸出的結果是:( )
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;
}
解析:
假設,a變量的地址為0x64,則a變量在內存中的模型為:
0x64| 44 |
0x65| 33 |
0x66| 22 |
0x67| 11 |
char*類型的指針變量pc指向只能指向字符類型的空間,如果是非char類型的空間,必須要將該空間的地址強轉為char*類型。
char *pc = (char*)&a; pc實際指向的是整形變量a的空間,即pc的內容為0x64,即44,
*pc=0,即將44位置中內容改為0,修改完成之后,a中內容為:0x11223300
因此:選擇C
原文鏈接:https://blog.csdn.net/qq_64836447/article/details/128983454
相關推薦
- 2022-12-11 Dos判斷文件夾是否存在,如果存在刪除,不存在創建_DOS/BAT
- 2022-10-24 C++??STL?_?Vector使用及模擬實現_C 語言
- 2022-09-18 jenkins配置golang?代碼工程自動發布的實現方法_Golang
- 2023-05-26 Pycharm直接使用遠程服務器代碼并調試的解決方法_python
- 2023-06-17 C語言string庫strcpy、strcmp、strcat函數的使用_C 語言
- 2022-04-22 數組去重并找到所有重復的項的索引位置
- 2022-10-14 面試官:int(1) 和 int(10) 有什么區別?
- 2023-06-04 django數據庫報錯解決匯總:django.db.utils.OperationalError?1
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支