C語言 溢位的處理及大小端模式的判斷

2021-09-08 21:54:58 字數 1421 閱讀 4449

我們都知道,字元char型別,占用的空間為8位,int型別占用空間為16位,當int賦值給char的時候會發生什麼效果呢?處理規則是什麼樣的呢?

方法一:

編寫如下**測試:

#include #include int main()

如果賦值之後,將保留高位位元組,捨棄低位位元組,將列印出13h;相反,如果保留低位位元組,捨棄低位位元組,控制台將會列印出 0a;

下面編譯執行結果為:

[root@localhost program]# vi addoverflowdemo.c

[root@localhost program]# gcc -g addoverflowdemo.c -o addoverflowdemo

[root@localhost program]# ./addoverflowdemo

sum = a

gcc下輸出為a,說明源程式是保留了低位位元組,捨棄了高位位元組。

方法二:

另外,通過判斷此機器的cpu的大小端模式,也可以判斷它的輸入,具體方法如下:

舉例如下,判斷機器的大小端模式:

判斷**:

#include #include int checkcpu( );

int main()

int checkcpu( )

c;           c.a = 0x12345678;

return(c.b ==0x78);

}}

如下為源**解釋分析:

union中定義的是變數公用位址空間,所以整形變數 a和字元型的變數 b的起始位址是相同的,即一開始存放的位置是相同的。

a = 0x12345678

如果要判斷,cpu體系是大端還是小端,就得知道 12作為高位位元組是存放在了記憶體的高位址端還是低位址端,如果高位位元組存放在了高位址端,那麼  char(a)只占用乙個位元組,它的值就應該是空間首位址的值:78,此時稱為小端模式;

記憶體位址

小端模式

大端模式

0x8000

7812

0x8001

5634

0x8002

3456

0x8003

1278

以上**輸出結果為:

[root@localhost program]# gcc -g checkendiandemo.c -o checkendiandemo

[root@localhost program]# ./checkendiandemo

little endian: 1

以上兩種方法可互相判斷。

C語言判斷大小端模式

1.大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 小端模式相反 2.為什麼有大小端之分?因為在計算機系統中,儲存是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組 8bit。在c語言中除了8bit的char之外,還有16bit的short型,32b...

c語言的union和大小端模式

在c語言中允許不同型別的資料使用同一段記憶體,也就是不容型別的變數存放起始位址相同的記憶體中,雖然他們占用的位元組數可能不同,但是起始位址相同。共用體就是這樣的型別,它採用的是覆蓋儲存技術,允許不同型別資料互相覆蓋,共享同一段記憶體。如下 include union x void main 雖然,沒...

C語言 大小端的問題

在計算機中資料一般都先存在記憶體中,拿32位機來說 系統為記憶體的每乙個位置都分配了乙個位址.位址 從0x00000000開始到0xffffffff 也許你的記憶體沒這麼大 那麼對於小端 little endain 來說,資料0x12345678在記憶體中的映像就是這個樣子的 78 0x000000...