-------------------------------------------------------------------------------------------------------------------
1. char --> int
特别注意char 的最高符号位是1的情况下的赋值
-------------------------------------------------------------------------------------------------------------------
char letter1 = 0x80;
// 1000 0000 ---> 不考虑符号位,它应该表示为10进制数的 128(10)
int num1 = letter1;
printf("num1 = %d , num1 = %x\n" , num1 , num1 );
// num1 = -128 , num1 = 0xFFFFFF80
if( letter1 < 0 ) {
cout << "In If letter1 < 0 " << endl;
// Do If sentence
} else {
cout << "In else letter1 >= 0 " << endl;
}
num1 :
0000 0000, 0000 0000 , 0000 0000, 1000 0000 // 多字节变量 num1 (内存, 2进制表示)
=========================== Assignment ==================
^
||
letter1 : 1000 0000 // 单字节变量 letter1 (内存, 2进制表示)
正常人,觉得单字节的变量赋值给多字节数,内存模型很简单(没有的位,用0补齐就OK了)
但其实不然!!!!!!!
这是因为char 是 signed char 的缩写,而最高位(符号位)为1
为了保证 letter1与赋完值num1为同号(同正或同负) 。 所以,没有的位,都用1来补齐了。
但如果把 代码修改一下
unsigned char letter1 = 0x80; // 1000 0000 ---> 不考虑符号位,它应该表示为10进制数的 128(10)
int num1 = letter1;
printf("num1 = %d , num1 = %x\n" , num1 , num1 ); // num1 = 128 , num1 = 0x80
if( letter1 < 0 ) {
cout << "In If letter1 < 0 " << endl;
} else {
cout << "In else letter1 >= 0 " << endl; // Do else sentence
}
总结,如果要使赋值后,按内存模型扣到int型上时,可以用以下语句
char letter1 = 0x80;
int num1 = (0xFF & 0x80); // 这样,就能使赋值后的int 变量与char型的变量保持一致了
这是我在网络编程时,由于要接受字节序列,偶然遇到一个Bug时,发现的问题
因为在接受数组时,会先接收数组的长度,貌似之前定的是byte型的,然后我赋值给了int,就发现长度是个负数了 囧
-------------------------------------------------------------------------------------------------------------------
2. int --> char 一切正常
-------------------------------------------------------------------------------------------------------------------
int num1 = 0x80;
char letter1 = num1;
printf("letter1 = %d, letter1 = %x\n", letter1, letter1); // num1 = -128 , num1 = 0xFFFFFF80 Well Done
if( letter1 < 0 ) {
cout << "In If letter1 < 0 " << endl; // Do If sentence
} else {
cout << "In else letter1 >= 0 " << endl;
}
阅读(1389) | 评论(0) | 转发(0) |