C/C++显式unsigned强制转换被忽略?相等判断结果异常原因
问题原因说明
你的强制类型转换没有被编译器忽略,判断相等是C/C++算术运算的默认类型转换规则导致的:
- 首先纠正你注释里的笔误:
0xFFFFFFF5作为32位无符号数对应十进制值4294967285,作为32位有符号int(补码存储)对应值-11,你注释里的signed、unsigned对应关系写反了。 - 你写的
(unsigned)i强制转换是完全生效的:DWORD本质是Windows定义的32位无符号整型,转换后左侧值就是无符号类型的0xFFFFFFF5(即4294967285),不存在转换被忽略的情况。 - 真正触发隐式转换的是
==运算符的类型匹配规则:当运算符两侧分别是unsigned int(无符号整型)和signed int(有符号整型)时,编译器会按照标准规定的通常算术转换规则,先把有符号一侧的操作数隐式转换为无符号整型,再做值比较。 - 有符号负数转无符号整型的计算遵循补码规则:转换结果 = 无符号类型可表示的最大值 + 1 + 负数值。32位无符号整型最大值是4294967295,加1得4294967296,加上-11后计算结果正好是4294967285,和左侧
(unsigned)i的值完全一致,因此条件判断成立,输出equal。
你可以做个简单验证:把比较代码改成
(unsigned)i == (long long)-11,此时因为long long的取值范围完全覆盖32位无符号整型,转换规则会把左侧无符号值转成long long类型的4294967285,和long long类型的-11比较,结果就会输出not equal。
对应的测试代码逻辑如下:
DWORD i = 0xFFFFFFF5; // 32位无符号值4294967285,对应32位有符号补码值-11 if((unsigned)i == -11) OutputDebugString(L"equal"); else OutputDebugString(L"not equal");
内容的提问来源于stack exchange,提问作者darro911
相关产品推荐
相关产品推荐

