Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42527
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-19 10:39
文章分类

全部博文(13)

文章存档

2016年(3)

2015年(5)

2014年(5)

我的朋友

分类: C/C++

2014-05-19 17:24:31

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

阅读(1378) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:printf函数的一些输出格式

给主人留下些什么吧!~~