2012-06-22 114 views
0

我是新來C.如何獲取c中給定數據類型的最大值?

for.eg說int有32767最大值(但是這個值可能與其他系統不同),我的問題是如何使用C程序來獲取任何數據類型的這些值或功能。

int,我試圖這種方法,但它返回-1

#include<stdio.h> 
void main(void){ 

unsigned int x=1; 
unsigned long count=0; 

for(x=1;;x++){ 

    if(x==0){break;} 
    count++; 

    } 

printf("%ld",count); 

} 
+0

它'UINT_MAX'和'ULONG_MAX'你在.. – SuperSaiyan

回答

4

limits.h具有恆定UINT_MAX,這是你想要的值。

您看到-1的原因就是%ldunsigned long的錯誤printf格式。使用%lu。 C不適合泛型編程,但最新的標準C11確實提供了根據參數類型(「類型 - 泛型表達式」)執行不同操作的宏。

我從來沒有使用過,但我希望你可以寫一個宏NUMERIC_LIMITS_MAX隱藏映射int -> INT_MAXunsigned char -> UCHAR_MAX等產生的代碼不會(還)是非常便攜的,因爲不會有太多的部分實現的C11,更不用說完整的了。

也就是說,對於無符號類型,您始終可以獲得最大值爲(unsigned long)(-1)等等。簽名的類型有點尷尬,因爲標準賦予了執行自由來做很多奇怪的事情。實際上,INT_MAX等於(((unsigned int)(-1))/2) + 1。理論上,允許int具有比unsigned int更多的填充比特,在這種情況下INT_MAX更小。

+0

但是如果我在64位系統上,那麼這些值可能對於那個系統是錯誤的,因爲這個頭文件中的值都是常量。 –

+0

@AshwiniChaudhary:標題中的值對於您正在使用的C實現來說總是正確的。如果你有一個64位的實現,並且我有一個32位的實現,那麼你的limits.h的內容與我的不同。同樣,如果您使用的是64位系統,但編譯/運行32位可執行文件,則與編譯64位版本時相比,您會看到一些限制值不同的值。 –

+0

啊!你正確使用'%lu',現在我的程序和UINT_MAX返回相同的值。 –

6
limits.h

定義表示的類型的限制(或邊界)數值。在你的情況下,INT_MININT_MAX將是一個便攜的方式來找出一個int可以容納的最小值和最大值。

http://en.wikibooks.org/wiki/C_Programming/C_Reference/limits.h

+0

謝謝,工作正常。 –

+0

但是如果我在64位系統上,那麼這些值可能對於那個系統是錯誤的,因爲這個頭文件中的值都是常量。 –

3

檢查this。一般來說,如果您有關於C或C++的問題,請嘗試先在本網站查詢,這是一個很好的參考。

+0

+1感謝您的鏈接。 –

0

解決方案,使INT的最大運行時間:

int main () 
{ 
    unsigned int y = (unsigned int)(~0)>>1; 
    printf ("max of int is %u\r\n",y); 
    return 1; 
} 

交代:

y = ~0設置Y在0二進制相反如果我們的系統是32位,所以0將用(0000 ... 0)(32)二進制表示,其二進制相反表示爲(1111 ... 1)(32)。

y>>1用1位移位y,所以y的值將是(0111 ..1)(31),其爲int

+0

你能解釋一下嗎? –

+0

如果我們printf -1爲十六進制printf(「%X \ n」, - 1),它將顯示0xFFFFFFFF。我不是認爲所有的體系結構都代表-1代表0XFFF ...我用另一種適用於所有體系結構的解決方案更新了代碼 – MOHAMED

+0

這隻適用於無符號整數類型 – CAFxX

0

只是打印-1的最大

#include "stdint.h" 

printf("Byte :%u, Short :%hu, Int :%u, Long Long :%llu\n", 
      (uint8_t)-1, (uint16_t)-1, (uint32_t)-1, (uint64_t)-1); 

的輸出是:

字節:255,簡稱:65535,INT:4294967295,龍隆 :18446744073709551615

我在Linux上...

+0

這將只適用於無符號整數類型 – CAFxX

+0

是的,但對於有符號數據類型,我認爲下面應該工作 'printf(「Byte:%u,Short:%hu ,((uint8_t)-1)/ 2,((uint16_t)-1)/ 2,((uint32_t)-1)/ 2,((uint64_t) - 1)/ 2);' – user1473808

相關問題