C/C++中位元組序、類型轉化的深入理解

來源:互聯網
上載者:User
如果將位元組序、類型轉化單獨一個拿出來說時,大家可能都覺得很簡單,但是理解的不深入。如果將其結合起來探討,可能我們就會理解的很透徹。

關於位元組序和類型轉化的基礎,大家如果不太理解,可以參考以下部落格:

https://my.oschina.net/u/1783725/blog/647973 大小位元組序

https://my.oschina.net/u/1783725/blog/700970 類型轉化

在進入正題之前,在囉嗦一句:

系統位元不同對應資料類型的位元組數大小也不同

詳細介紹兩者之間的聯絡

位元組序: 操作的記憶體,就是將我們看到的資料存放在記憶體中的規則。

大位元組序:大端有效 ,高位元據先放入低地址記憶體 , 低位元據放入高地址記憶體;小位元組序:小端有效,低位元據先放入低地址記憶體 , 高位元據再放入高地址記憶體

操作記憶體(如:memcpy)就需要考慮位元組序

類型轉化: 操作的是讀出的資料,就是將從記憶體中讀取的資料,根據類型位元組的大小進行轉化。

位元多的轉化為位元小的(會截斷高位的資料,留下地位的資料),位元小的轉化為位元多的(將高位的資料補為0)。

一個例子來讀懂他們

1、賦值與位元組序無關,操作記憶體(memcpy)就需要考慮位元組序

1:將unsigned long long類型的0xABCDEF1234賦值給unsigned long類型的變數,與位元組序無關

2:unsigned long long類型的0xABCDEF1234變數使用memcpy到short類型的變數,發現為0,與位元組序有關

代碼如下:

#include <stdio.h>int main(int argc, char *argv[]){unsigned long long ullVar = 0xABCD1234;unsigned long ulVar1 = 0;unsigned long ulVar2 = 0;/*memcpy操作記憶體時,需要考慮系統的大小位元組序,如果是大位元組序的話,高位的資料儲存在低地址上*/memcpy(&ulVar1,&ullVar,sizeof(ulVar1));/*賦值時,就是講讀出的資料按照要賦值的資料類型的大小進行轉換*/ulVar2 = ullVar;printf("ulVar1=%x      ulVar2=%x \n",ulVar1,ulVar2); //輸出:ulVar1=0      ulVar2=abcd1234return 0;}
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.