關於C語言中變量類型轉換


今天在工作中遇到一個問題,而在解決問題的過程中,發現一段關於int 型變量(a)和char型(b)變量間類型轉換的代碼存在問題:一個值為255的int型變量a,強制類型轉換並賦值給char型變量b后,b的值是-1,而不是255。雖然要解決的問題並不是由於這段代碼導致的,但是這個細節在C編程中還是挺重要的,因此晚上下班回來后在自己的筆記本電腦上對這一問題進行了簡單測試和整理,算是給自己個提醒,於是有了下面的這段代碼:

#include <stdio.h>

iint main(void)
{
     iint a = 255;
     char ch;
     short sh;
     unsigned char uc;
     unsigned short us;
     
     ch = (char)a;
     sh = (short)a;
     uc = (unsigned char)a;
     us = (unsigned short)a;
     printf("ch = %d, sh = %d, uc = %d, us = %d\n", ch, sh, uc, us);
     
     printf("size: \nchar[%d], short[%d], unsigned char[%d], unsigned short[%d]\n",\
             sizeof(char), sizeof(short), sizeof(unsigned char), sizeof(unsigned short));
     
     return 0;
 }

編譯后運行的結果是:

ch = -1, sh = 255, uc = 255, us = 255
size: 
char[1], short[2], unsigned char[1], unsigned short[2]

注: 筆記本電腦是Intel Core I3處理器, 操作系統是 CentOS7_X86_64,內核 3.10.0

問題分析:
由於char型變量占1個字節,但最高位是作為符號位的,因此值范圍是 -128 ~ 127, unsigned char型變量也占1個字節,但沒有符號位,因此值范圍是 0 ~ 255, short型和unsigned short型都占2個字節,因此出現上述結果不足為奇。對於這個問題,下面這篇博客分析的很清楚:http://blog.csdn.net/daiyutage/article/details/8575248
雖然只是個很小的問題,但由此可以給自己兩點提醒:
1) 不要過於依賴強制類型轉換,一個變量在定義時就應該根據其可能的值范圍選擇合適的變量類型;
2)編寫代碼時一定要細心,不要忽略了細節,否則有可能會導致一些很奇怪的問題,並且排查起來非常難!
3)細心!注重細節!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM