2017-09-03 202 views
-3

我寫了下面的程序,它似乎對我需要做的事很好。但是,我不知道爲什麼UINT_MAX是給我-1輸出(通過的printf()),而不是4294967295,如下規定:https://www.tutorialspoint.com/c_standard_library/limits_h.htm爲什麼UINT_MAX返回-1?

#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); 

}

難道我省略了細節或誤解的東西?

+4

使用'%zu'代替'size_t'('sizeof'的結果)和'%u'代替'unsigned int' – BLUEPIXY

回答

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的結果是正確的說明符。

+0

使用[printf](http://en.cppreference.com/w/) c/io/fprintf)C特定的參考站點。 – EsmaeelE

1

因爲您使用%d其中預計簽署int。改用%u代替。

二的補-1二進制表示相同 UINT_MAX