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)则是完全相等的。这使得修改变量类型会引发比较结果的变化,尤其是在做变量扩展,或者在模板代码中这个问题有可能会引发难以觉察的错误。
对这个问题的建议是:永远都不要进行有符号类型和无符号类型之间的数值比较,不同长度的类型之间的比较也要尽量避免。
# re: 不同种类的整型比较,到底发生了什么?
2007-07-17 11:42 by
up,估计写单片机程序、游戏的朋友对这个会比较关注,其他人没遇到问题的话,基本就放过了 :-)
# re: 不同种类的整型比较,到底发生了什么?
2007-07-17 13:09 by
我也碰到过这类问题,后来我基本上全用unsigned char来操作,vc有个选项,让char和unsigned char一样。
# re: 不同种类的整型比较,到底发生了什么?
2007-07-19 11:00 by
这个文章不错,以前碰到过这样的问题,没做细研究,只是都用UNSIGNED CHAR 就完了
# re: 不同种类的整型比较,到底发生了什么?
2007-07-22 00:03 by
其实不只在单片机程序时需要注意这些。
vc6中,写的程序,有时一不小心就得不到正确的结果。
# re: 不同种类的整型比较,到底发生了什么?
2007-07-22 20:10 by
"永远都不要进行有符号类型和无符号类型之间的数值比较", 对对对,说的太对了。
# re: 不同种类的整型比较,到底发生了什么?
2007-09-03 15:38 by
vc资料站:
http://www.vcmsdn.com/ 对学习很有帮助的,可以上去
看看,或加群46138350,里面有高手可以请教的。
# re: 不同种类的整型比较,到底发生了什么?
2007-12-23 16:30 by
便携式[url=
http://www.kinmark.com/dahaoji.htm]打号机[/url]采用手提式一体化设计,适合携带外出作业;高亮度大屏幕液晶显示便于模拟显示;
# re: 不同种类的整型比较,到底发生了什么?
2007-12-23 16:31 by
全部采用进口工业部件,抗震、抗压;采用无硬盘、防水小键盘等先进技术;<A href="
http://www.kinmark.com/dahaoji.htm">打号机</a>应用范围:激光生产的MYQD型打号机适合于大型工件或不方便移动工件的打号.
# 长沙google推广
2008-07-29 22:56 by
[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]