十六进制数相等的推断

请问例如以下程序的输出是神马?

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

为何不相等呢?

看截图:

详细原因:字面值常量也是有默认类型的,详细例如以下

  1. 整形字面值常量(0xfe。0x124,123,0)的类型是int
  2. 字符字面值常量('\0','0','a')的类型是char
  3. 布尔字面值常量(true,false)的类型是bool
  4. 字符串字面值("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

最新文章

  1. .NET MVC TempData、ViewData、ViewBag
  2. linux命令分享(四):iostat
  3. NOIP2000乘积最大[序列DP]
  4. js日期显示效果
  5. CF459E Pashmak and Graph (DP?
  6. navicat 链接linux 服务器上的数据库
  7. VS中遇到的奇怪问题
  8. wireshark抓包直观图解 TCP三次握手/四次挥手详解
  9. iOS8远程通知处理
  10. vim 自動化配置
  11. usaco 奶牛集会 &amp;&amp; 奶牛抗议
  12. [git] git 的基本认知
  13. Android数据库信息显示在listview上
  14. 【python】字符排序
  15. 关于Vue的路由、脚手架笔记
  16. .net core 上传文件大小限制 webconfig
  17. MFC中创建自定义消息
  18. 破解第二课 JMP法
  19. 【进阶3-4期】深度解析bind原理、使用场景及模拟实现(转)
  20. D. Mysterious Crime

热门文章

  1. systemverilog(3)之Randomize
  2. Django中重定向页面的时候使用命名空间
  3. MPEG-4视频编码核心思想
  4. django的rest framework框架——安装及基本使用
  5. 本机机器ssh docker容器
  6. java编程思想阅读记录
  7. ImportError: No module named ‘MySQLdb&#39;
  8. Django深入----django.db.transaction
  9. CF802D
  10. 【HTML/XML 1】HTML 速成总结