数据类型转换的有关问题_朗讯笔试题 求解·
数据类型转换的问题_朗讯笔试题 求解···
#include <string>
void main()
{
char cA;
unsigned char ucB;
unsigned short usC;
cA = 128;
ucB = 128;
usC=cA+ucB;
printf("0x%x\n",usC);
usC=cA+(short)ucB;
printf("0x%x\n",usC);
usC=(unsigned char)cA+ucB;
printf("0x%x\n",usC);
usC=cA+(char)ucB;
printf("0x%x\n",usC);
}
输出答案:
0x00
0x00
0x100
0xff00
不懂怎么转换的啊····求详细解答
------解决思路----------------------
第一个
char cA;
// 这里超过了有符号char的范围[-128, 127],实际表示成了-128,
// 因为-128的有符号char的二进制正好是无符号char的128
cA = 128;
usC=cA+ucB; // 相当于-128 + 128 = 0
usC=cA+(short)ucB; // 这里依然是0,unsigned char提升到short,高位符号位扩展都是0
// 这里将signed char cA(-127)强制表示成unsigned char为128
// 即 128 + 128 = 256
usC=(unsigned char)cA+ucB;
// 这里等号右边强制将unsigned char ucB转换成signed char为-128
// 所以等号右边相当于-128 + -128 = -256,然后char是被提升到int计算的
// 所以符号位扩展为0xffff0000,
// 最后在=赋值的时候又强制转换为unsigned short,截断高为,得0xff00.
usC=cA+(char)ucB;
lz学习一下补码,原码,以及数据类型之间转换时的优先级,符号位扩展知识就明白了.
#include <string>
void main()
{
char cA;
unsigned char ucB;
unsigned short usC;
cA = 128;
ucB = 128;
usC=cA+ucB;
printf("0x%x\n",usC);
usC=cA+(short)ucB;
printf("0x%x\n",usC);
usC=(unsigned char)cA+ucB;
printf("0x%x\n",usC);
usC=cA+(char)ucB;
printf("0x%x\n",usC);
}
输出答案:
0x00
0x00
0x100
0xff00
不懂怎么转换的啊····求详细解答
------解决思路----------------------
第一个
char cA;
// 这里超过了有符号char的范围[-128, 127],实际表示成了-128,
// 因为-128的有符号char的二进制正好是无符号char的128
cA = 128;
usC=cA+ucB; // 相当于-128 + 128 = 0
usC=cA+(short)ucB; // 这里依然是0,unsigned char提升到short,高位符号位扩展都是0
// 这里将signed char cA(-127)强制表示成unsigned char为128
// 即 128 + 128 = 256
usC=(unsigned char)cA+ucB;
// 这里等号右边强制将unsigned char ucB转换成signed char为-128
// 所以等号右边相当于-128 + -128 = -256,然后char是被提升到int计算的
// 所以符号位扩展为0xffff0000,
// 最后在=赋值的时候又强制转换为unsigned short,截断高为,得0xff00.
usC=cA+(char)ucB;
lz学习一下补码,原码,以及数据类型之间转换时的优先级,符号位扩展知识就明白了.