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