除法和 NSUInteger

发布于 2024-07-15 06:07:35 字数 293 浏览 5 评论 0原文

我有一些涉及负值的计算:

row = (stagePosition - col) / PHNumRow;

假设 stagePosition 是 -7,col 是 1。它们都是 NSInteger,包括 row。 PHNumRow 是 8。

如果 PHNumRow 是 NSInteger,我得到我期望的结果:-1。 但如果 PHNumRow 是 NSUInteger,则结果是垃圾。

除数是无符号还是有符号为什么重要? 我不会将结果放入无符号整数中。

I have some calculation that involves negative values:

row = (stagePosition - col) / PHNumRow;

Say stagePosition is -7 and col is 1. They are both NSInteger, including row.
PHNumRow is 8.

If PHNumRow is NSInteger, I get the result I expect: -1.
But if PHNumRow is NSUInteger, the result is garbage.

Why should it matter if the divisor is unsigned or signed?
I'm not putting the result in an unsigned int.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浅暮の光 2024-07-22 06:07:36

因为整数提升。 当计算右侧时,所有参数都将提升为表达式操作数的最高类型,如果 PHNumRow 为无符号,则该表达式将是无符号整数。 编译器会执行类似于以下内容的操作:

((NSUInteger)stagePosition - (NSUInteger)col) / PHNumRow;

由于 stagePosition 为负数,因此存在环绕,并且您的计算会蓬勃发展!

Because of integer promotion. When the right hand side is evaluated, all arguments are promoted to the highest type of the operands of the expression which, if PHNumRow is unsigned, will be unsigned integer. The compiler does something similar to the following:

((NSUInteger)stagePosition - (NSUInteger)col) / PHNumRow;

Since, stagePosition is negative, there is a wraparound and your computation goes boom!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文