程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 溢出的處理及大小端模式的判斷

溢出的處理及大小端模式的判斷

編輯:關於C

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

方法一:


編寫如下代碼測試:


[html]
#include <stdio.h> 
#include <stdlib.h> 
 
int main() 

char sum; 
int operator1 = 4874; 
//4874 = 0000 0000,0000 0000,0001 0011,0000 1010 hexadecimal 00 00 13 0A 
sum = operator1; 
//situation 1 sum = 0000 0000; cut the higher bits:13 
//situation 2 sum = 0000 1010; cut the lower bits:0A 
printf("sum = %x\n",sum); 
 
return EXIT_SUCCESS; 

#include <stdio.h>
#include <stdlib.h>

int main()
{
char sum;
int operator1 = 4874;
//4874 = 0000 0000,0000 0000,0001 0011,0000 1010 hexadecimal 00 00 13 0A
sum = operator1;
//situation 1 sum = 0000 0000; cut the higher bits:13
//situation 2 sum = 0000 1010; cut the lower bits:0A
printf("sum = %x\n",sum);

return EXIT_SUCCESS;
}

如果賦值之後,將保留高位字節,捨棄低位字節,將打印出13H;相反,如果保留低位字節,捨棄低位字節,控制台將會打印出 0A;

下面編譯運行結果為:


[html]
[root@localhost program]# vi addoverflowDemo.c 
[root@localhost program]# gcc -g addoverflowDemo.c -o addoverflowDemo 
[root@localhost program]# ./addoverflowDemo  
sum = a 

[root@localhost program]# vi addoverflowDemo.c
[root@localhost program]# gcc -g addoverflowDemo.c -o addoverflowDemo
[root@localhost program]# ./addoverflowDemo
sum = a

GCC下輸出為a,說明源程序是保留了低位字節,捨棄了高位字節。

方法二:


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


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

判斷代碼:


[html]
#include <stdio.h> 
#include <stdlib.h> 
 
int checkCPU( ); 
int main() 

printf("little endian: %d\n",checkCPU()); 
return EXIT_SUCCESS; 

int checkCPU( ) 

    { 
           union w 
           {   
                  int  a; 
                  char b; 
           } c; 
           c.a = 0x12345678; 
           return(c.b ==0x78); 
    } 
}  

#include <stdio.h>
#include <stdlib.h>

int checkCPU( );
int main()
{
printf("little endian: %d\n",checkCPU());
return EXIT_SUCCESS;
}
int checkCPU( )
{
    {
           union w
           { 
                  int  a;
                  char b;
           } c;
           c.a = 0x12345678;
           return(c.b ==0x78);
    }
}


如下為源代碼解釋分析:

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

a = 0X12345678

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

但是如果char(a)的值是 12,那麼就說明高位字節存放在了低地址端,此時是大端模式:參考下圖:

內存地址 小端模式 大端模式
0x8000 78 12
0x8001 56 34
0x8002 34 56
0x8003 12 78


以上代碼輸出結果為:


[html]
[root@localhost program]# gcc -g checkendianDemo.c -o checkendianDemo 
[root@localhost program]# ./checkendianDemo  
little endian: 1 

[root@localhost program]# gcc -g checkendianDemo.c -o checkendianDemo
[root@localhost program]# ./checkendianDemo
little endian: 1

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved