2013-06-05 36 views
2

我想寫一個簡單的C代碼,顯示在C中的各種變量類型的最大值和大小。但是,我得到了一些奇怪的輸出,如sizeof()操作符返回-1的一些變量類型。我認爲問題在於我在printf命令中使用的說明符,因爲當我在下面的代碼中將'%e'更改爲'%d'時,即使對於沒有更改的說明符,我也會得到非常不同的輸出。我的問題是如何獲得正在尋找的正確輸出,即第一列中變量類型的最大值和第二列中變量類型的大小。C中limits.h * _MAX常量的正確說明符是什麼?

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

int main() 
{ 

    printf("Float max: %e Nbytes: %d\n",FLT_MAX,sizeof(float)); 
    printf("Double max: %e Nbytes: %d\n",DBL_MAX,sizeof(double)); 
    printf("Int max:  %e Nbytes: %d\n",INT_MAX,sizeof(int)); 
    printf("UnInt max: %e Nbytes: %d\n",UINT_MAX,sizeof(unsigned int)); 
    printf("LongIntmax: %e Nbytes: %d\n",LONG_MAX,sizeof(long)); 
    printf("UnLong max: %e Nbytes: %d\n",ULONG_MAX,sizeof(unsigned long)); 
    printf("Longlongmax: %e Nbytes: %d\n",LLONG_MAX,sizeof(long long)); 


    exit(0); 
} 

輸出我從爲編寫的代碼得到如下:

Float max: 3.402823e+38 Nbytes: 4  
Double max: 1.797693e+308 Nbytes: 8  
Int max:  1.797693e+308 Nbytes: 2147483647  
UnInt max: 1.797693e+308 Nbytes: -1  
LongIntmax: 1.797693e+308 Nbytes: -1  
UnLong max: 1.797693e+308 Nbytes: -1  
Longlongmax: 1.797693e+308 Nbytes: -1  

但是,如果切換所有的「%E」到「%d」我再次得到運行代碼:

Float max: 4 Nbytes: -1290994504  
Double max: 8 Nbytes: 605613584  
Int max:  2147483647 Nbytes: 4  
UnInt max: -1 Nbytes: 4  
LongIntmax: -1 Nbytes: 8  
UnLong max: -1 Nbytes: 8  
Longlongmax: -1 Nbytes: 8  

第一次運行的第二列輸出成爲第二次運行的第一列輸出。我不確定這裏發生了什麼事。再次,我認爲我將錯誤的說明符綁定到* _MAX常量,但我不確定是否還有其他問題。

+0

'sizeof'不返回-1(打印最大的無符號值時,將它作爲有符號值打印到la'%d')會給出-1。你也遇到了浮動 - >雙倍晉升時通過。 – user7116

回答

3

是的,問題是與符 - 你需要讓他們匹配參數(其被提升和float%f/%e/%gdouble%d的簽署,%u無符號。 l中間爲每個long。最後size_t需要%zu

printf("Float max: %f Nbytes: %zu\n",FLT_MAX,sizeof(float)); 
    printf("Double max: %f Nbytes: %zu\n",DBL_MAX,sizeof(double)); 
    printf("Int max:  %d Nbytes: %zu\n",INT_MAX,sizeof(int)); 
    printf("UnInt max: %u Nbytes: %zu\n",UINT_MAX,sizeof(unsigned int)); 
    printf("LongIntmax: %ld Nbytes: %zu\n",LONG_MAX,sizeof(long)); 
    printf("UnLong max: %lu Nbytes: %zu\n",ULONG_MAX,sizeof(unsigned long)); 
    printf("Longlongmax: %lld Nbytes: %zu\n",LLONG_MAX,sizeof(long long)); 

你得到-1因爲你觸發未定義行爲時,格式字符串不匹配參數。

+0

謝謝,現在有道理! – Joshua

+0

@sixlettervariables:不,它不是。如果「printf」的實際提升參數的類型與格式說明符所需的類型不匹配,則行爲是未定義的。資料來源:C99 7.19.6.1第8段:「如果任何參數不是相應轉換規範的正確類型,則行爲未定義。」 –

+0

@R ..:我收回我的評論,因爲我同意它是ub,但是,值得注意的是「-1」是* not *當使用錯誤說明符時打印的內容。在這種情況下,這是因爲系統中無符號和有符號整數之間的關係。 – user7116

相關問題