char变量赋值给unsigned short 或 unsigned intchar chunsigned short uShunsigned long uIntch 0xF0
char变量赋值给unsigned short 或 unsigned int
char ch;
unsigned short uSh;
unsigned long uInt;
ch = 0xF0;
uSh = ch;
uInt = ch;
printf("uSh = %x,uInt = %x,uSh = %d,uInt = %d\n",uSh,uInt,uSh,uInt);
上面这道题有2个疑问,忘大牛帮忙解惑一下
问题1:为什么uSh和uInt变量的高位部分全部填充了ff?而把char ch改为unsigned char ch,uSh和uInt变量高位部分则为0了。
问题2:当ch是char型时,printf的结果是sh = fff0,uInt = fffffff0,uSh = 65520,uInt = -16
(为什么是-16呢,而不是0xfffffff0换成十进制的值,莫非%d的格式化打印不出来?)
当char是unsigned char时,printf的结果是sh = f0,uInt = f0,uSh = 240,uInt = 240
[解决办法]问题1:为什么uSh和uInt变量的高位部分全部填充了ff?而把char ch改为unsigned char ch,uSh和uInt变量高位部分则为0了。
----- 当为signed char扩展时,高字节不填充1,怎么能保证其值还是 -16?
当为unsigned char扩展时,高字节不填充0,怎么能保证其值还是 240?
不这样做就不符合正常人的逻辑呀!
问题2:……
----- 格式跟实际类型不符,按标准应当是
"uSh = %hx,uInt = %lx,uSh = %hu,uInt = %lu\n"
也就是 short 要加前修饰h,long要加前修饰l;无符号类型是u, d是有符号类型