-1真的比1小吗?
来源:互联网 发布:淘宝相片拍摄 编辑:程序博客网 时间:2024/04/28 00:41
-1真的比1小吗?
看到这篇博客的朋友,此时在想什么?不妨把现在所想写出来。
-1比1小,小学生都知道。但是在今天编程的时候,我发现了一个让我耗费了几个小时才搞清楚的事情。
事情是这样的。
class A,有一个unsigned int GetLength()方法,class B同样有一个unsigned int GetLength()方法。依据A、B创建a、b实例。
char * buff1和char * buff2,buff1-buff2=-1,也就是buff2指向的地址比buff1指向的地址高一个字节。
程序中,当(buff1-buff2) < (a.GetLength()+b.GetLength())时需要执行一些必要的操作。如:
if( (buff1-buff2) < (a.GetLength()+b.GetLength()) )
{
....
}
在程序运行过程中,打印buff1-buff2的值,为-1,(a.GetLength()+b.GetLength()) 的值为1,但是,无论如何也进入不了if的条件为true的代码段,即上面代码的“...”部分。
也许有经验的人,到此已经知道了问题所在,但是,我却经过了几个小时才搞清楚我究竟犯了什么错。
其实,问题很简单,GetLength方法返回的值是无符号整型,在比较大小时,编译器偷偷地为我们做了一件事,她把-1进行了类型提升为unsigned int类型,因此,-1编程了无符号整型中最大的值。从而,我们无论如何都得不到正确的结果。
数据类型的提升,说起来大家可能都很清楚,但有些时候这种隐蔽的类型转换,我们还真的要小心。
下面的代码,永远都会对你说:“-1不小于1”
#include <iostream>
int main(int argc,char * argv[])
{
if(-1<2u)
{
std::cout<<"-1确实小于1"<<std::endl;
}
else
{
std::cout<<"-1不小于1"<<std::endl;
}
return 0;
}
- -1真的比1小吗?
- C++真的比Java快吗?
- ArrayList真的比LinkedList慢吗
- C++真的比C差吗
- Hibernate返回id比Oracle实际小1的问题
- size_t的值几乎都比-1要小
- 指针真得比数组快吗?函数调用会拖慢程序多少?++i 比i = i+1 快吗?
- exists真的就比in的效率高吗?
- 所谓的方向比努力重要,是真的吗?
- exists真的就比in的效率高吗?
- NET真的一定比JAVA快吗?
- python真的比C/C++"慢"吗?
- 单引号真的比双引号更具效率吗?
- 外企的福利真比国企差吗?
- ++i 真的比 i++ 性能高吗?
- LinkedList 增删真的比ArrayList快吗?
- JSON真的比XML好很多吗?
- JDOM真的比DOM4j要慢么?
- Mantis的连接数据库密码和登录用户密码修改
- xp+ubuntu双系统上重装Xxp后修复grub方法
- 高效的javascript 幻灯片
- asp.net 操作Access数据库,sql
- 在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法
- -1真的比1小吗?
- 公有继承 保护继承 私有继承 自己总结!
- 41个 IE layout BUG
- 数据库 SQL 遍历父子关系表(二叉树)获得所有子节点 所有父节点
- 关于联通API接口收不到上行短信问题
- ora-01034 ,ora-27101
- Xpath 笔记
- asp.net 随机生成数字,asp.net随机生成字母数字
- 为工作项排队:一次就足够