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来对抗不合理的-10xFF
与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);