當前位置:首頁 » 存儲配置 » 小端存儲輸出後

小端存儲輸出後

發布時間: 2022-07-27 09:15:23

1. 大端存儲和小端存儲的區別

大端模式就是低位存放在高地址上。高位存放在地址上。
小端模式就是地位存放在低地址上。高位存放在高地址上。
例如,16bit寬的數0x1234在Little-endian模式CPU內存中的存放方式(假設從地址0x4000開始存放)為:
內存地址 0x4000 0x4001
存放內容 0x34 0x12
而在Big-endian模式CPU內存中的存放方式則為:
內存地址 0x4000 0x4001
存放內容 0x12 0x34

2. C語言問題求解

這個問題涉及到內存分布,在這里我假設你的電腦採用小端格式存儲數據(小端格式存儲不了解的話先網路下)。

1、首先可以列出第一個語句 struct data d = {"", -3, 769} 賦值後的內存分布,分布如下:

00 00 00 00 00 00 00 00 fd ff ff ff 01 03 00 00

從內存分布可知前8個0就是d.str,0xfffffffd代表d.arr[0] =-3,0x00000301代表d.arr[1]=769

註:默認從左往右的地址為從低到高,符合小端格式的設定

2、執行scanf("%s", d.str);//這里輸入1234abcdef 語句後的內存分布如下:

31 32 33 34 61 62 63 64 65 66 00 ff 01 03 00 00

由於"1234abcdef"的長度10超過了a.str的大小8,那麼後面的2位元組就會被覆蓋,從內存上看,從左往右的10個位元組分別對應於"1234abcdef"的ascii碼;那麼為什麼0x66('f')後面的位元組為0了呢?那是因為字元串以''結尾,所以這個位元組也被覆蓋了。

3、執行*((char*)(&d.str)+ 13) = '';語句後內存分布如下:

31 32 33 34 61 62 63 64 65 66 00 ff 01 00 00 00

這個語句的含義是將從d.str地址開始後的第13個位元組置為'』,也就是0x03->0x00;注意第13個位元組的下標應該從0開始算。

4、執行*(d.arr) += *(d.arr + 1) + 3;語句

*(d.arr + 1)其實就是等於d.arr[1]的值,也就是0x00000001,也就是1,那麼*(d.arr + 1) + 3就等於4;*(d.arr)其實就是a.drr[0]=0xff006665,加上4就等於0xff006669;那麼經過計算後的內存分布就變為:

31 32 33 34 61 62 63 64 69 66 00 ff 01 00 00 00

5、printf("%d ", d.arr[0]);輸出什麼?

從上面內存分布可以看到,d.arr[0]其實就是0xff006669,其二進制可以表示為:

1111 1111 0000 0000 0110 0110 0110 1001(高位在前表示)

最高位為1,代表為負數;由於計算機存儲負數是用補補碼存儲的,所以這里需要將補碼轉換成原碼,也就是是補碼+1再除符號位每位取反就可以了。

補碼加1:1111 1111 0000 0000 0110 0110 0110 1010

除符號位取反(原碼):1000 0000 1111 1111 1001 1001 1001 0101

由於最高位為1表示負數:所以上面表示 -(0000 0000 1111 1111 1001 1001 1001 0101)=-16750999

所以:這句話輸出-16750999

6、執行*d.arr = 825373492;後的內存分布

將825373492用16進制可以表示為:0x31323334(高位在前);這語句其實是對d.addr[0]進行賦值,所以就會覆蓋原來的0xff006669,覆蓋後的內存分布為:

31 32 33 34 61 62 63 64 34 33 32 31 01 00 00 00

7、執行d.arr[1] += 0xff;後的內存分布

執行完上面所有步驟後d.arr[1] = 0x00000001; 那麼執行完d.arr[1] = d.arr[1] + 0xff後就等於256,256的16進製表示為0x00000100;所以內存分布如下:

31 32 33 34 61 62 63 64 34 33 32 31 00 01 00 00

8、printf("%s ", d.str);輸出

從語句d.str的含義可知是列印從d.str地址開始的內容,直到遇到''為止(與我們理解的列印d.str有一點偏差),也就是列印31 32 33 34 61 62 63 64 34 33 32 31 00;查詢ascii碼可知這就是字元串"1234abcd4321";所以最後列印1234abcd4321。

綜上可知:程序最後輸出:

-16750999

1234abcd4321

3. 關於大端小端存儲和內存的使用

親 這個問題該結了

4. 關於大端小端存儲和內存的的使用

1、大端(big endian)與小端(little endian)指的是「位元組序」,嚴格的說,並不是針對單個變數。
2、後面兩問有點模糊,我想你是想說,連續的定義兩個變數吧,具體的地址分配行為是取決於編譯器的,不過一般來說,如果分配在棧上,比如,你在main函數裡面連續定義連個,一般棧是倒增長的,即這兩個變數的地址將會是又高到低。
如果靜態分配、或者在堆上分配,比如你在main函數外,全局的連續的定義兩個變數,則這兩個變數的地址將會是又低到高。

5. 大端和小端存儲法是什麼兩者有什麼區別

小端:較高的有效位元組存放在較高的的存儲器地址,較低的有效位元組存放在較低的存儲器地址。
大端:較高的有效位元組存放在較低的存儲器地址,較低的有效位元組存放在較高的存儲器地址。
大端模式就是低位存放在高地址上。高位存放在地址上。
小端模式就是地位存放在低地址上。高位存放在高地址上。
例如,16bit寬的數0x1234在Little-endian模式CPU內存中的存放方式(假設從地址0x4000開始存放)為:
內存地址 0x4000 0x4001
存放內容 0x34 0x12
而在Big-endian模式CPU內存中的存放方式則為:
內存地址 0x4000 0x4001
存放內容 0x12 0x34

6. 求以下程序的輸出結果:

@假設你的電腦是32位操作系統

先介紹兩個概念,大端存儲和小端存儲:

小端存儲:低位元組存在地址低位

大端格式:高位元組存在地址高位

那麼這個題分兩種情況,當你的電腦是小端時:

s.b = 0xa0000L,也就是地位地址存儲方式是0x00 0x00 0x0a 0x00,由此可見s.c[2] = 0x0a,s.c[0] = 0x00,所以輸出:10A

當你的電腦是大端時候:

s.b = 0xa0000L,也就是地位地址存儲方式是0x00 0x0a 0x00 0x00,由此可見s.c[2] = 0x00,s.c[0] = 0x00,所以輸出:0A

7. 大端存儲和小端存儲各自的優缺點是什麼

沒有什麼優缺點.

最好輸入輸出流,程序一致用同一種方式,全用big endian,或 little endian. 省去byte 交換。

8. ARM中同個字用大端和小端儲存時 載入出來有什麼區別

存儲時用大端模式 載入時按地址從低到高(默認)就會使高低位互換,但是你要是在載入時特意高到底那就沒什麼了。

9. 大端存儲方式和小端存儲方式的區別

採用大小模式對數據進行存放的主要區別在於在存放的位元組順序,大端方式將高位存放在低地址,小端方式將低位存放在高地址。採用大端方式進行數據存放符合人類的正常思維,而採用小端方式進行數據存放利於計算機處理。到目前為止,採用大端或者小端進行數據存放,其孰優孰劣也沒有定論。

熱點內容
php旅遊網站系統 發布:2024-05-07 20:27:32 瀏覽:610
jdk源碼怎麼看 發布:2024-05-07 20:18:22 瀏覽:519
編程c語言自學書 發布:2024-05-07 20:12:03 瀏覽:422
usb大容量存儲驅動 發布:2024-05-07 19:02:01 瀏覽:815
紅米1s沒有存儲空間 發布:2024-05-07 18:59:09 瀏覽:505
妖雲解壓密碼 發布:2024-05-07 18:50:08 瀏覽:1002
sql語句等於怎麼寫 發布:2024-05-07 18:05:46 瀏覽:816
我的世界電腦版第三方伺服器大全 發布:2024-05-07 18:00:46 瀏覽:627
主伺服器的ip地址 發布:2024-05-07 17:58:50 瀏覽:546
組伺服器打電腦游戲 發布:2024-05-07 17:46:19 瀏覽:866