2011-01-30 60 views
3

我想知道什麼是我的time_t可以容納的最大值,所以我寫了一個幫助我的小程序。它需要一個參數:字節量(1字節= 8位)。所以我寫了它並測試了它。它從1直到4的所有值都很好,但是在5和更高時它也編輯了「簽名」位(我不知道它是如何調用的)。有人可以解釋:計算有符號整數的最大大小

#include <stdio.h> 

int main(int argc, const char **argv) { 
    if(argc != 2) { 
    fprintf(stderr, "Usage: %s bits/8\n", argv[0]); 
    return -1; 
    } 

    unsigned int bytes; 
    sscanf(argv[1], "%u", &bytes); 

    unsigned int i; 
    signed long long someInt = 0; 
    size_t max = bytes*8-1; 
    for(i = 0; i < max; i++) { 
    someInt |= 1 << i; 
    } 

    /* Print all bits, we substracted 
    1 to use in the previous loop so 
    now we add one again */ 
    max++; 
    for(i = 0; i < max; i++) { 
    int isAct = (someInt >> max-i-1) & 1; 
    printf("%d", isAct); 
    if((i+1) % 8 == 0) { 
     printf(" "); 
    } 
    } 
    printf("\n"); 

    printf("Maximum size of a number with %u bytes of 8 btis: %lld\n", bytes, (long long)someInt); 

    return 0; 
} 

我的測試:

Script started on Sun Jan 30 16:34:38 2011 
bash-3.2$ ./a.out 1 
01111111 
Maximum size of a number with 1 bytes of 8 btis: 127 
bash-3.2$ ./a.out 2 
01111111 11111111 
Maximum size of a number with 2 bytes of 8 btis: 32767 
bash-3.2$ ./a.out 4 
01111111 11111111 11111111 11111111 
Maximum size of a number with 4 bytes of 8 btis: 2147483647 
bash-3.2$ ./a.out 5 
11111111 11111111 11111111 11111111 11111111 
Maximum size of a number with 5 bytes of 8 btis: -1 
bash-3.2$ ./a.out 8 
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 
Maximum size of a number with 8 bytes of 8 btis: -1 
bash-3.2$ exit 
exit 

Script done on Sun Jan 30 16:35:06 2011 

我希望從這一個學習,所以我會很感激,如果有人能找到一些時間來看看這個。

ief2

回答

1

您只使用一個int,即1,爲您的換擋操作。這

someInt |= 1LL << i; 

會做得更好,我認爲。

通常我無法知道有一個有符號整數類型的最大值,其中只有typedef而沒有冒險未定義的行爲或編譯器和平臺特定的屬性。例如,<<運營商可能在簽名類型上遇到問題。

time_t特別奇怪,因爲它可能是浮點類型或整數類型。如果它是一個整數,它是不是被指定,如果它是有簽名的。

如果你想它是一個符號整型不要有所謂的填充位(大多數平臺上符合該)的最大值,可以直接

((((1LL << (sizeof(time_t)*CHAR_BIT-2)) - 1) << 1) + 1) 

不計算溢出。

+0

非常感謝你,給我的整數常量加上`LL`確實解決了我的問題。在我的Mac OS X平臺上,`time_t`被定義爲`/usr/include/i386/_types.h:typedef long __darwin_time_t;`。我不知道什麼是填充位,但無論如何我的可執行文件現在可以工作。 – v1Axvw 2011-01-30 17:03:02