Panic的小屋

国破山河在,城春草木深。
随笔 - 151, 评论 - 1287, 引用 - 22, 文章 - 0

导航

公告

<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

留言簿(250)

随笔分类

随笔档案

文章档案

相册

国外好站推荐

工具网页

我的其他网页

我的网友

户外运动

美女的空间

搜索

最新评论

阅读排行榜

评论排行榜

不同种类的整型比较,到底发生了什么?

Posted on 2007-07-17 11:31 Panic 阅读(4206) 评论(11)  编辑 收藏
看这么两行代码:
int i = -1;
cout << (char(i) == unsigned char(i)) << endl;
在VC6.0下,永远输出0。而下面这两行代码也永远输出0
int i = 255;
cout << (char(i) == unsigned char(i)) << endl;

而实际上,以上两个代码中,char(i)和unsigned char(i)具有的内存布局都是完全相同的。由于整型之间的类型转换遵循这样的原则:当目标类型比原类型短的时候,直接截断原类型。而当目标类型较长,则无符号类型会直接在高位补0,有符号类型在高位补符号位。

在VC6下,而当两个长度相同,并且具有相同内存布局的整型相比较的时候,编译器做如下的工作:
首先两者长度<=int的长度的时候,全部转化为int,然后实施比较。
所以char(-1)转化的结果是0xFFFFFFFF,而unsigned char(-1)转化的结果是0x000000FF。两者作为int比较的时候,自然是不相等的。
但是,特别的,当两者长度刚好是int长度的时候,比较的结果仅取决于内存布局,而有符号和无符号的转化也不会改变内存布局。

这个事实引起了一个问题,当我们使用char/unsigned char,short/unsigned short这类比int短的类型的时候,无符号类型的变量是绝对不会和有符号的-1相等的,而使用int的时候,int(-1)和unsigned int(-1)则是完全相等的。这使得修改变量类型会引发比较结果的变化,尤其是在做变量扩展,或者在模板代码中这个问题有可能会引发难以觉察的错误。

对这个问题的建议是:永远都不要进行有符号类型和无符号类型之间的数值比较,不同长度的类型之间的比较也要尽量避免。

Feedback

# re: 不同种类的整型比较,到底发生了什么?

2007-07-17 11:42 by oshj
up,估计写单片机程序、游戏的朋友对这个会比较关注,其他人没遇到问题的话,基本就放过了 :-)

# re: 不同种类的整型比较,到底发生了什么?

2007-07-17 13:09 by Diviner
我也碰到过这类问题,后来我基本上全用unsigned char来操作,vc有个选项,让char和unsigned char一样。

# re: 不同种类的整型比较,到底发生了什么?

2007-07-19 11:00 by XXX
这个文章不错,以前碰到过这样的问题,没做细研究,只是都用UNSIGNED CHAR 就完了

# re: 不同种类的整型比较,到底发生了什么?

2007-07-22 00:03 by sjdev
其实不只在单片机程序时需要注意这些。
vc6中,写的程序,有时一不小心就得不到正确的结果。

# re: 不同种类的整型比较,到底发生了什么?

2007-07-22 20:10 by HateMath
"永远都不要进行有符号类型和无符号类型之间的数值比较", 对对对,说的太对了。

# re: 不同种类的整型比较,到底发生了什么?

2007-09-02 12:24 by 丽丽
根本无法比较。。。

# re: 不同种类的整型比较,到底发生了什么?

2007-09-03 15:38 by maggie
vc资料站:http://www.vcmsdn.com/     对学习很有帮助的,可以上去

看看,或加群46138350,里面有高手可以请教的。

# re: 不同种类的整型比较,到底发生了什么?

2007-12-23 16:30 by shuabi
便携式[url=http://www.kinmark.com/dahaoji.htm]打号机[/url]采用手提式一体化设计,适合携带外出作业;高亮度大屏幕液晶显示便于模拟显示;

# re: 不同种类的整型比较,到底发生了什么?

2007-12-23 16:31 by shabi
全部采用进口工业部件,抗震、抗压;采用无硬盘、防水小键盘等先进技术;<A href="http://www.kinmark.com/dahaoji.htm">打号机</a>应用范围:激光生产的MYQD型打号机适合于大型工件或不方便移动工件的打号.

# re: 不同种类的整型比较,到底发生了什么?

2008-07-29 22:56 by 长沙google推广


[url=http://www.555920.cn/changshaguge.htm]长沙google推广[/url]

# 长沙google推广

2008-07-29 22:56 by 长沙google推广

[url=http://www.555920.cn]北京左侧google优化 推广[/url]
[url=http://www.555920.cn/changshaguge.htm]长沙google推广[/url]
[url=http://www.555920.cn/changshaguge.htm]长沙google优化[/url]
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]