我写了以下程序,似乎对我需要做的事情很有效。但是,我想知道为什么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);
}
我是否省略了细节或误解了什么?
答案 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);
它会给你你期望的结果。
正如其他人所指出的,%zu
是sizeof
结果的正确说明符。
答案 1 :(得分:1)
因为您使用期望签名%d
的{{1}}。使用%u代替。
在二进制补码中,-1二进制表示与...相同 UINT_MAX