char与 int 类型转化问题汇总

1.char变为int时高位符号扩展问题

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

	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;
}

  

原文地址:https://www.cnblogs.com/simonLiang/p/5871450.html