C 计算和使用uint32\u t的最大值

C 计算和使用uint32\u t的最大值,c,gcc,c99,C,Gcc,C99,我知道存在UINT32\u MAX,但我一直无法使用它。我尝试了printf(“%d\n”,UINT32\u MAX)并打印出-1。使用%ld而不是%d给我带来了一个错误,即UINT32\u MAX属于unsigned int类型,需要%d将其打印出来 请帮助,我理想的需要是一个宏/枚举,它保存最大值word\t,这是我定义的类型,当前为uint32\t 我希望我清楚地说明了我想要什么,如果没有,请随时提问 编辑 我忘了说我到底想做什么。所有这些都将用于将整数数组全部设置为其最大值,因为该整数数

我知道存在
UINT32\u MAX
,但我一直无法使用它。我尝试了
printf(“%d\n”,UINT32\u MAX)并打印出
-1
。使用
%ld
而不是
%d
给我带来了一个错误,即
UINT32\u MAX
属于unsigned int类型,需要
%d
将其打印出来

请帮助,我理想的需要是一个宏/枚举,它保存最大值
word\t
,这是我定义的类型,当前为
uint32\t

我希望我清楚地说明了我想要什么,如果没有,请随时提问

编辑


我忘了说我到底想做什么。所有这些都将用于将整数数组全部设置为其最大值,因为该整数数组实际上是将所有位设置为1的位图。

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


编辑:忽略此答案并使用更完整的James方法。

打印
uintN\t
对象的便携方法是将其转换为
uintmax\t
,并使用
j
长度修饰符和
u
转换说明符:

printf("%ju\n", (uintmax_t)(UINT32_MAX));
j
表示参数是
intmax\u t
uintmax\u t
u
表示它是无符号的,因此它是一个
uintmax\u t

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


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

如果要将无符号int数组设置为最大值,可以通过memset执行:


memset(数组,0xFF,sizeof(无符号整数)*arraysize)

您遇到了特定的问题,因为
%d
是签名格式设置程序

有很多方法可以修复它(已经建议了两种),但真正正确的方法是使用
中定义的格式说明符:


如果
int
用16位表示会怎么样?@James那么,我会用你的答案:)在
inttypes.h
中有
PRIu32
,对于常见的情况,格式字符串是在与
printf
语句相同的源代码中定义的。如果格式字符串是在其他地方定义的,可能不兼容,那就不好了。非常感谢,不过这并不重要,使用它不会打印出来,但是这个答案让我明白了问题所在。史蒂夫:很有趣;我不知道那些在里面!我提到他们是一个永远不会为实际使用这些东西而烦恼的人。除了调试(在这种情况下,您知道实现),
printf
是UI编程。我不在C中使用UI;-)
long
至少为32位,因此
%lu
(无符号长)UINT32_MAX
成对在一起应该可以。这根本不起作用,0xFF与
UINT32_t
完全无关。它用0xFF一次填充内存块一个字节。每个int*数组4个字节。如果
字符位==8
,这对于
uint32\u t
(如问题中所述)是正确的,因为
uint32\u t
保证没有填充位。从技术上讲,它对于
unsigned int
是不可移植的,因为它允许有填充位,如果是这样的话,这可能会创建一个陷阱表示。但我们也从问题中了解到,在提问者使用的实现上,这两种类型是相同的。所以+1来对抗不合理的-1
0xFF
uint32\u t
相关,假设为8位字节。对于16位字节,这将是错误的,因此最好使用
-1
而不是
0xff
@Steve:uint32 t
唯一存在的方法是
字符位
为8、16或32。如果将
0xFF
替换为
-1
:-),则该假设将消失如果要将无符号整数设置为所有位-1,则只需为其赋值
-1
。类型无关紧要(只要它是无符号的),有符号整数在实现中的表示也无关紧要,并且您不需要为正确的最大值找出宏的名称(这使得处理将来可能更改的typedef变得更容易)@Steve Jessop:这只是一种偶然的行为,还是你真的可以信赖?这是C标准的保证。有符号到无符号的转换为6.3.1.3/2,无符号整数类型的表示为6.2.6.2/1(虽然实际上您并不关心存储表示,但您只关心通过“在新类型中可以表示的最大值上再加一个”将
-1
转换为无符号,因此,
-1
转换为任何无符号类型都是UTYPE_MAX)。我知道谈论“正确”的方法可能是无用的。。。但是~0不应该比-1好吗。。。我的意思是,~0是你真正想要的,-1只是给出~0作为加法/减法的副作用。
printf("%" PRIu32 "\n", UINT32_MAX);
uint32_t number;
printf("number is %" PRIu32 "\n", number);