我們都知道,字元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...