如何将UInt32设置为其最大值

53
  1. UInt32的最大值是多少?

  2. 我能否使用sizeof运算符来获取最大值(因为它是无符号的)?这样我就不用在代码中使用#define或魔术数字。


2
那不应该是 2^32 - 1 吗? - devnull
1
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html#//apple_ref/doc/c_ref/NSNotFound - Mick MacCallum
9
该死的SO,你以前可真友好。这是一个合理的问题,为什么会有那么多的踩?讨厌的人总是要恶意攻击,但我希望他们能在别的地方发泄。 - Aran Mulholland
1
(uint32_t)0-1 ;-) - Codebeat
6个回答

82

1
你已经得到了我的点赞,但如果你列出一些类似MAXFLOAT的宏,对未来的用户可能会有帮助。 - Mick MacCallum
@0x7fffffff 你应该查看一下<stdint.h>。里面实际上有几十个宏,定义了所有有符号和无符号整数类型的min、max以及其他一些宏。这些都是在ISO/IEC 988:1999规范中定义的。 - CouchDeveloper
谢谢,这正是我所需要的。 - Aran Mulholland

19

UInt32的最大值为0xFFFFFFFF(或十进制中的4294967295)。

sizeof(UInt32)不会返回最大值,它将返回4,即32位无符号整数的字节大小。


谢谢,我在想也许你可以对它进行一些简单的算术运算(sizeof(UInt32) * 8)^2。这有点过度了,当我问的时候有点困。 - Aran Mulholland

4

只需使用标准十六进制表示法设置最大值,然后将其与您需要的任何内容进行比较。32位是8个十六进制字节,因此它应该像这样:

let myMax: UInt32 = 0xFFFFFFFF

if myOtherNumber > myMax {
    // resolve problem
}

4
可移植的方式:
std::numeric_limits<uint32_t>::max()

为什么这更具可移植性? - Aran Mulholland
与某些硬编码值相比,更具可移植性。也许uint32_t不是一个很好的例子。如果以std::numeric_limits<int32_t>为例,您不必对如何在机器上编码有符号数字进行假设。如果您采用std::numeric_limits<unsigned int>,则不会对int的大小进行任何假设,因为这取决于所针对的硬件是否始终为32位。它也比宏更灵活。如果您需要更改类型,例如通过typedef,则无需更新代码中所有类似UINT32_MAX的宏。 - Renaud
3
这个答案是关于C++代码的,但问题是关于iOS上的Objective C。 - Julien-L

2

4_294_967_295是最大值,或者用十六进制表示为0xFFFFFFFF。


0

在 C 或 C++ 中,任何无符号的替代方案是:

anUnsigned = -1;

这很有用,因为它适用于所有类型,所以如果你将 unsigned int 更改为 unsigned long,你不需要检查整个代码。你也会看到它在许多位操作的代码中使用:

anUnsigned |= -(aBoolOrConditionThatWhenTrueCausesAnUnsignedToBeSetToAll1s)
anUnsigned |= -(!aValueThatWhenZeroCausesAnUnsignedToBeSetToAll1s)
anUnsigned |= -(!!aValueThatWhenNonZeroCausesAnUnsignedToBeSetToAll1s)

缺点是看起来很奇怪,将负数赋值给无符号数!


有时候这样做会导致编译器警告或静态分析警告,可惜它其实运行得很好! :) - ericcurtin
为了避免编译器警告并让其他读者清楚地知道你在做什么,将值强制转换为正确的类型,例如 anUnsigned = (uint32_t)-1; - Jac Goudsmit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接