c - C中的1U和1有什么区别吗?

c - C中的1U和1有什么区别吗?

4 回答 4

This answer is useful

22

在大多数编译器上,两者都会给出具有相同表示的结果。但是,根据 C 规范,对有符号参数进行位移操作的结果会给出实现定义的结果,因此理论上 1U << i比1 << i. 实际上,您将遇到的所有 C 编译器都将有符号左移视为无符号左移。

另一个原因是如果nSize是无符号的,那么将它与有符号的比较1 << i会产生编译器警告。更改1to1U会消除警告消息,您不必担心如果i是 31 或 63 会发生什么。

编译器警告很可能是1U出现在代码中的原因。我建议在打开大多数警告的情况下编译 C,并通过更改代码来消除警告消息。

于 2010-11-16T09:05:32.400 回答

This answer is useful

7

1U 未签名。它可以携带两倍大的值,但没有负值。

根据环境,使用 U 时,i 最多可以是 31 或 15,而不会导致溢出。如果不使用 U,i 最多可以是 30 或 14。

31, 30 用于 32 位 int

15, 14 用于 16 位 int

于 2010-11-16T08:59:15.467 回答

This answer is useful

4

如果 nSize 是int,则最大值可以是 2147483647 (2^31-1)。如果你使用1而不是1Uthen1 << 30将得到 1073741824 并且1 << 31将是 -2147483648,因此如果 nSize 大于 1073741824,while 循环将永远不会结束。

使用1U << i,1U << 31将计算为 2147483648,因此您可以安全地将其用于 nSize 高达 2147483647。如果 nSize 是无符号整数,则循环也可能永远不会结束,因为在这种情况下 nSize 可以大于1U << 31。

编辑: 所以我不同意告诉你 nSize 应该是无符号的答案,但如果它是有符号的,那么它不应该是负数......

于 2010-11-16T09:13:54.593 回答

This answer is useful

1

1U 未签名。

他们在那个表达式中使用无符号值的原因是(我猜)因为nSize它也是无符号的,并且编译器(当使用某些参数调用时)在比较有符号和无符号值时会发出警告。

另一个原因(在我看来不太可能,但如果不知道nSize应该假设的 wath 值我们就无法知道)是无符号值可能是有符号值的两倍,因此nSize可能高达 ~4*10^9 而不是 ~ 2*10^9。

于 2010-11-16T09:04:40.223 回答

相关推荐

台风会带来哪些灾害?
365659

台风会带来哪些灾害?

📅 07-19 👁️ 9685