char與 int 類型轉化問題匯總


1.char變為int時高位符號擴展問題

int main()
{
	char a = 0x9a;
	int util;
	util = (int)a;
	if(util > 0)
		printf("positive\n");
	else
		printf("negative\n");

	return 0;
}


0x9a --- 1001 1010 但是強制轉換的過程中,int是有符號的,需要對0x9a進行符號擴展,也就是用最高位1來擴展其他3個字節(架設int為4個字節)就會變成
1111111 11111111 11111111 10011010 (8為二進制數中最高位為符號位 默認就是1為負)所以上數是二進制補碼表示的-102
將 util = (int)a 修改為 util = (int)(unsigned char)a 即可!!

 

2.int轉為char時的數據流失

int main()
{
	char c;
	while(c=getchar())!=EOF)
		putchar(c);  
	return 0;
}

各種系統都有自己默認的char類型,可能是unsigned char也可能是signed char.假設此處默認是unsigned char。

  getchar()返回一個int型,將被強制轉換成unsigned char賦給c,這樣當getchar讀取完畢返回EOF (-1)的時候,轉換成unsigned char 后的ASCII的值是255。 然后,系統在比較c(unsigned char)和EOF 時,均被轉換為 unsigned int 來比較。前者是 (unsigned int)255 后者是(unsigned int )-1 ,但是8位的-1 和32 位的 -1差距卻很大,永遠不會相等,因此造成死循環!!

應該改成-->>

int main()
{
	int c;
	while(c=getchar())!=EOF)
		putchar(c);  
	return 0;
}

  

 


免責聲明!

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



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