网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)
2024-09-08 01:11:57
十六进制数相等的推断
请问例如以下程序的输出是神马?
#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
用字面值常量给变量赋值会出现截断情况,
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FsbXJlYXNvbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="max-width:98%">
上面是字面值常量的类型,以下是截断的规则。以下这张图是关键
正确的做法:
(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
最新文章
- .NET MVC TempData、ViewData、ViewBag
- linux命令分享(四):iostat
- NOIP2000乘积最大[序列DP]
- js日期显示效果
- CF459E Pashmak and Graph (DP?
- navicat 链接linux 服务器上的数据库
- VS中遇到的奇怪问题
- wireshark抓包直观图解 TCP三次握手/四次挥手详解
- iOS8远程通知处理
- vim 自動化配置
- usaco 奶牛集会 &;&; 奶牛抗议
- [git] git 的基本认知
- Android数据库信息显示在listview上
- 【python】字符排序
- 关于Vue的路由、脚手架笔记
- .net core 上传文件大小限制 webconfig
- MFC中创建自定义消息
- 破解第二课 JMP法
- 【进阶3-4期】深度解析bind原理、使用场景及模拟实现(转)
- D. Mysterious Crime