为什么UINT_MAX返回-1?

时间:2017-09-03 20:22:24

标签: c memory

我写了以下程序,似乎对我需要做的事情很有效。但是,我想知道为什么UINT_MAX在输出中给出-1(通过printf())而不是4294967295,如下所示:https://www.tutorialspoint.com/c_standard_library/limits_h.htm

#include <stdio.h>
#include <limits.h>

int main () {

printf("Below is the storage size for various data types.\n\n");

//char data type
printf("**char**\nStorage size: %d byte \t Minimum value: %d \t Maximum value: %d\n\n", sizeof(char), CHAR_MIN, CHAR_MAX);

//signed char data type
printf("**signed char**\nStorage size: %d byte \t Minimum value: %d \t Maximum value: %d\n\n", sizeof(signed char), SCHAR_MIN, SCHAR_MAX);

//unsigned char data type
printf("**unsigned char**\nStorage size: %d byte \t Maximum value: %d\n\n", sizeof(unsigned char), UCHAR_MAX);

//int data type
printf("**int**\nStorage size: %d bytes \t Minimum value: %d \t Maximum value: %d\n\n", sizeof(int), INT_MIN, INT_MAX);

//unsigned int data type
printf("**unsigned int**\nStorage size: %d bytes \t Maximum value: %d\n\n", sizeof(unsigned int), UINT_MAX);

}

我是否省略了细节或误解了什么?

2 个答案:

答案 0 :(得分:3)

传递给%d的格式字符串中的

printf表示signed integer(有关详细信息,请参阅此链接:http://www.cplusplus.com/reference/cstdio/printf/)。

您尝试格式化并打印无符号整数的最大值,就好像它是有符号整数一样。因为有符号整数不能保持无符号整数的最大值(最高有效位用于符号),它会溢出并开始获得负数。

如果您将示例修改为:

printf("**unsigned int**\nStorage size: %zu bytes \t Maximum value: %u\n\n", sizeof(unsigned int), UINT_MAX);

它会给你你期望的结果。

正如其他人所指出的,%zusizeof结果的正确说明符。

答案 1 :(得分:1)

因为您使用期望签名%d的{​​{1}}。使用%u代替。

在二进制补码中,-1二进制表示与...相同 UINT_MAX