实战经验:避免在组件接口中使用unsigned
作者:BlogUpdater |
时间:2018-07-15 |
浏览:2166 |
评论已关闭 条评论
示例代码
=====================MyList.h=====================
#pragma once
#include <windows.h>
class CMyList
{
public:
CMyList(void) {}
~CMyList(void) {}
public:
UINT GetSize1() const {return 10;}
int GetSize2() const {return 10;}
};
=====================Main.cpp=====================
#include "stdafx.h"
#include "MyList.h"
int _tmain(int argc, _TCHAR* argv[])
{
CMyList myList;
if (myList.GetSize1() > -1)
{
printf("10 > -1\n");
}
else
{
printf("10 <= -1\n");
}
if (myList.GetSize2() > -1)
{
printf("10 > -1\n");
}
else
{
printf("10 <= -1\n");
}
getchar();
return 0;
}
编译执行,结果如下:

我们看到一个现象,两个方法,GetSize1和GetSize2都返回正整数10,但是,和-1对比的结果却是不一样的。
代码解析
在if表达式中,GetSize1返回了一个unsigned int,在和-1进行比较时,-1会被隐式转换为一个无符号数,也即 -1 => 2(32)(32为上标,即2的32次方) -1 => 4294967295,所以if表达式任务GetSize1() > -1 为 FALSE,虽然我们直觉上认为:10 > -1 肯定返回 TRUE。
结论
当表达式中同时存在无符号和有符号的整数时,编译器会悄悄将有符号的数转为无符号数,导致一些意想不到的情况发生,从而增加了我们的调试复杂度。所以,避免在对外接口方法中使用unsigned类型,可以最大限度阻止这种编译器隐式转换。
如需转载,请注明来自:拓扑梅尔智慧办公平台 | TopomelBox 官方站点
- 下一篇: 深度理解:#pragma once防止文件重复包含
- 上一篇: 深度理解:类前置声明的使用
相关推荐
- 如何使用 TopomelBox 发送即时消息
- Posted on 01月27日
- 第 51 期:微软 KB5058499 更新终于让 Windows 11 24H2 上的游戏稳定一些
- Posted on 05月30日
- C++20的Chrono扩展正式可用
- Posted on 06月17日
- 第 146 期:Windows 11 的 Copilot 应用确认使用最新 GPT-5 大模型
- Posted on 08月01日



评论已关闭。