【发布时间】:2023-03-08 20:22:01
【问题描述】:
a 是有符号整数,包含 -100 b 是一个无符号整数,包含 500
a<b returns FALSE!!
到底为什么? :P
我可以将 b 转换为 signed int 并获得正确的结果, 但原样离开,结果让我大吃一惊, 因为我不知道为什么 -100
如果我们保持原样,即第一个签名的和 第二个未签名,那么为什么要
这真的很令人困惑。
现在我必须更正我的所有代码,寻找 有符号和无符号整数之间的比较,以及强制转换 这两个变量都是我的意思。 :-/
还有其他需要注意的情况吗 混合有符号和无符号类型时?
请不要回复明显的“一般使用 无符号类型是不建议的,你为什么不坚持 只有签名类型?你会更安全”。谢谢。
干杯。
【问题讨论】:
-
你也显示所有相关代码怎么样?
-
更好的是:将有符号转换为无符号并具有
a<b,a=500 和b=-100,或者将无符号转换为有符号并具有a<b,a=3000000000 和b=-1? IMO,两者都不好,这就是为什么你不应该比较不同符号的值。当您执行此操作时,Clang 和 gcc 会警告您,不确定 Visual Studio。 -
使用正确的警告级别,您应该会收到针对此类代码的警告。类似于
implicit conversion changes signedness: 'int' to 'unsigned long'。 -
Now I have to correct all of my code, looking for comparisons between signed and unsigned ints, and cast both variables to the type I mean.编译器没有生成警告,说明您在表达式中混合了有符号和无符号整数吗? -
“就像编译器自动将 a 强制转换为无符号类型”。是的。谷歌“C 常用算术转换”。
标签: c++ c visual-c++