网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)
来源:互联网 发布:百香坊沉香淘宝 编辑:程序博客网 时间:2024/05/22 15:31
十六进制数相等的判断
请问如下程序的输出是神马?
#include <iostream>#include <string>using namespace std;int main (int, char *[]){ char s[1]={0}; s[0] = 0xfe; if (s[0] == 0xfe) { cout<<"=="<<endl; } else { cout<<"!="<<endl; } return 0;}
为何不相等呢?
看截图:
具体原因:字面值常量也是有默认类型的,具体如下
- 整形字面值常量(0xfe,0x124,123,0)的类型是int
- 字符字面值常量('\0','0','a')的类型是char
- 布尔字面值常量(true,false)的类型是bool
- 字符串字面值("abc")的类型是const char*
http://zhidao.baidu.com/question/198400742.html?qbl=relate_question_1&word=C%2B%2B%20%CA%FD%D6%B5%C4%AC%C8%CF%C0%E0%D0%CD
用字面值常量给变量赋值会出现截断情况,
上面是字面值常量的类型,下面是截断的规则,下面这张图是关键
正确的做法:
(1)用字面值常量赋值的时候保证左操作数的类型可以包容又操作数的值(0x**的一个字节十六进制字面值都可以被char包含,所以可以放心赋值)
(2)用变量和字面值进行逻辑和关系运算时,考虑字面值的默认类型和变量类型是否相同(不相同会发生隐式类型转换),相同时看看字面值会不会发生(1)的情况
#include <iostream>#include <string>using namespace std;int main (int, char *[]){ char s[1]={0}; s[0] = (char)0xfe;// s[0] = fe , s[0] < 0 if (s[0] == (char)0xfe) //禁止类型转换到int { cout<<"=="<<endl; } else { cout<<"!="<<endl; } return 0;}
所以,char变量赋值常数的时候要强制转换,判断相等的时候避免转换到int
0 0
- 网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)
- C语言中的常量和字面值
- C/C++中的字面值常量
- C++Primer读书笔记之字面值常量
- C/C++中的字面值常量、常量以及变量
- c++pri 2/22--字面值常量
- C++语言之字面值常量
- C++语言之字面值常量练习
- 重新组织数据之九 :Replace Magic Number with Symbolic Constant(以符号常量/字面常量取代魔法数)
- C++编程常见错误之-类中的常量
- JAVA常量(字面值)表示方法
- 字面值(常量)到底是什么数据类型
- 字面值常量
- 2.2 字面值常量
- 2.2 字面值常量
- 字面值常量
- c++ 字面值常量
- 字面值常量
- 设计模式之——工厂模式(A)
- poj2528 线段树 离散化
- Java 异步IO(1) 文件异步IO
- 关于STL
- 计算机中字符编码
- 网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)
- [非技术]-电话面试感想
- Jetty9x+Logback Webapp日志输出
- EXCEL按照文字颜色统计数量
- Android学习笔记(二)
- 归并排序O-O
- 第六话-装饰模式
- 约瑟夫问题解法
- VPN服务器哪种好 什么VPN代理服务器软件最好用