c++ - 警告 C4018 带有 int 和 UINT32,但不带有 int 和 UCHAR
问题描述
使用 VS 2017,此片段生成编译器警告 C4018:
UINT32 numChars(2);
int i;
for( i=0; i<numChars; i++ )
但这不是:
UCHAR numChars(2);
int i;
for( i=0; i<numChars; i++ )
回想起那个
typedef unsigned int UINT32
typedef unsigned char UCHAR
为什么行为上的差异?
解决方案
在比较不同类型的整数时,应用通常的算术转换。这意味着如果适用,首先提升两个整数,然后,如果结果仍然是不同的类型,则将精度较低的类型转换为具有较高精度的类型,或者,如果两者具有相同的精度,则将有符号的类型转换为无符号的一。
所以在你的第一种情况下,你有一个无符号整数和一个有符号整数。两者都没有被提升,因为它们都已经是 int,所以有符号的 int 被转换为无符号的。当它作为比较的一部分发生时,这会触发警告。
在您的第二种情况下,将UCHAR
提升为有符号的 int,因为它可以由一个表示。现在您正在比较两个有符号整数,因此不需要进行进一步的转换。
推荐阅读
- java - 系统目录到java列表
- python - 如何在 Seaborn Heatmap 单元格中显示多个注释?
- python - 散景日志轴格式为十进制
- r - 使用 arules 包对特定列进行离散化:
- android - ReactNative - 对象作为 React 子对象无效
- php - RSS 编码问题
- vue.js - Vuetify 和 require.js:如何显示动态组件?
- django - 自定义 LoginView django extra_context
- c# - 未授予所需的权限。必须至少授予以下权限之一: 用户
- c# - 使用 razor if 语句时出现 NullReferenceException