计算和使用uint32_t的最大值

7
我知道UINT32_MAX存在,但我无法使用它。我尝试了printf("%d\n", UINT32_MAX);,结果打印出-1。使用%ld而不是%d会出现错误,因为UINT32_MAX是无符号整数类型,需要%d来打印它。
请帮忙提供一个宏/枚举,用于保存word_t的最大值,该类型由我定义,当前为uint32_t
如果我的意思不清楚,请随时问我。
编辑:
我忘了说我实际上想做什么。所有这些都将用于设置一个整数数组的所有元素为它们的最大值,因为该整数数组实际上是一个位图,将所有位设置为1。

2
如果您想将无符号整数设置为全为1的状态,则只需将“-1”分配给它即可。类型并不重要(只要它是无符号的),实现上有符号整数的表示方式也不重要,而且您也不需要弄清楚正确的最大值宏的名称(这使得处理可能在未来更改的typedef变得更加容易)。 - Steve Jessop
1
@Steve Jessop:这只是偶然的行为还是你真的可以依赖它? - orlp
1
这是由C标准保证的。有符号到无符号的转换是6.3.1.3/2,而无符号整数类型的表示是6.2.6.2/1(尽管实际上您不关心存储表示,只关心“通过“添加可以在新类型中表示的最大值加一”的方式将“-1”转换为无符号,因此将“-1”转换为任何无符号类型都是UTYPE_MAX)。 - Steve Jessop
3
我知道谈论“正确”的方法可能是无用的......但是零或许比负一更好吧?我的意思是,零其实是你真正想要的,而负一只是通过加减法得到零的副作用。 - Hobblin
4个回答

13

打印 uintN_t 对象的可移植方式是将其转换为 uintmax_t 并使用带有 u 转换说明符和 j 长度修饰符进行打印:

printf("%ju\n", (uintmax_t)(UINT32_MAX));

j 表示该参数是 intmax_tuintmax_tu 表示它是无符号的,因此为 uintmax_t

或者,您可以使用在 <inttypes.h> 中定义的格式字符串(在这种情况下,您将使用 PRIu32):

printf("%" PRIu32 "\n", UINT32_MAX);

你不能只使用%u,因为它不能保证int至少由32位表示(它只需要至少由16位表示)。


inttypes.h 中有 PRIu32,适用于格式字符串与 printf 语句在同一源代码中定义的常见情况。如果格式字符串是在其他地方定义的,可能不兼容,那么这个方法就不行了。 - Steve Jessop
非常感谢,虽然这并不重要,但这个答案让我明白了问题所在。已接受。 - orlp
@Steve:有趣,我不知道那些在里面! - James McNellis
我提到它们是因为有些人从来不会真正使用这些东西。除了调试(在这种情况下,您知道实现),printf 是 UI 编程。我不用 C 做用户界面编程;-) - Steve Jessop
long 至少有 32 位,因此 %lu(unsigned long)UINT32_MAX 配对在一起应该没问题。 - u0b34a0f6ae

4

你遇到了这个特定问题,因为%d是一个有符号的格式化程序。

解决此问题有多种方法(已经提出了两种),但真正正确的方法是使用在<inttypes.h>中定义的格式说明符:

uint32_t number;
printf("number is %" PRIu32 "\n", number);

2

%d 用于有符号整数。使用 %u

编辑:忽略此答案,使用 James 的答案,它更完整。


如果int用16位表示会怎样? - James McNellis
@James 好的,我会使用你的答案 :) - Pascal Cuoq

0
如果您要将无符号整数数组设置为最大值,则可以通过memset进行操作:
memset(array, 0xFF, sizeof(unsigned int) * arraysize);

这根本行不通,0xFF与uint32_t完全无关。 - orlp
它以每次一个字节的方式填充内存块,使用0xFF。每个int *数组大小为4个字节。 - nullforce
假设 CHAR_BIT == 8,对于 uint32_t(如问题中所述),这是正确的,因为保证 uint32_t 不会有填充位。对于 unsigned int 来说,从技术上讲它不具备可移植性,因为它可以有填充位,如果有填充位,则可能会创建陷阱表示。但我们也知道从问题中提出者使用的实现来看,这两种类型本质相同。所以加1来抵消无法解释的-1。假设字节为8位,则 0xFFuint32_t 相关。对于16位字节,这将是错误的,因此最好使用 -1 而不是 0xff - Steve Jessop
@Steve:uint32_t存在的唯一方式是CHAR_BIT为8、16或32。如果你只用-1替换0xFF,这种假设就会消失。 :-) - R.. GitHub STOP HELPING ICE

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