2011-03-24 81 views
0

我知道C中數據類型的大小並不是所有架構師都是固定的。如何預測C中特定數據類型的大小?

但是對於一個固定的CPU架構師,我該如何預測sizeof(unsigned short)的大小?

通過預測我的意思是不是通過測試(printf("%d",sizeof(unsigned short));

回答

3

閱讀編譯器的文檔。

1

你要麼閱讀編譯器文檔或寫,你可以在你需要收集更多的信息架構/編譯器運行程序:

/* $Id: sizeof.c,v 1.1 2009/07/05 10:37:54 sms Exp $ 
* www.pccl.demon.co.uk 
* Program to display data sizes. */ 

#include <stdio.h> 
#include <time.h> 
#include <sys/types.h> 

#define printsize(x) printf ("sizeof (" #x ") = %d\n", sizeof (x)) 

main() 
{ 
    printf ("\nC\n"); 
    printsize (char); 
    printsize (double); 
    printsize (float); 
    printsize (int); 
    printsize (long); 
    printsize (long long); 
    printsize (short); 
    printsize (void *); 

    printf("\n"); 
    printsize (clock_t); 
    printsize (gid_t); 
    printsize (pid_t); 
    printsize (size_t); 
    printsize (ssize_t); 
    printsize (time_t); 
    printsize (uid_t); 
} 

http://www.pccl.demon.co.uk/C/sizeof.html

+0

是的,「構建系統測試它」是一種常見的解決方案。 – dmckee 2011-03-24 06:35:29

+1

我會拋出函數指針的大小。它可能與數據指針大小不同。 – 2012-03-13 21:31:50

1

你不能「預測」的大小以字節爲單位,但你可以「預測」的範圍:

#include <limits.h> 

#if USHRT_MAX < 65535 
/* less than the minimum guaranteed by the Standard: will never happen */ 
#elif USHRT_MAX == 65535 
/* minimum guaranteed by the Standard: 2 8-bit bytes */ 
#elif USHRT_MAX <= 420042 
/* a little more room than guaranteed by the Standard */ 
#elif USHRT_MAX <= 2000000000 
/* a lot more room than guaranteed by the Standard */ 
#else 
/* 640K ought to be enough for anybody */ 
#endif 
1

如果你想擁有一致的,可預測的尺寸爲您的數據類型,你不應該是我們ing short,int,long等.C99標準引入了用於指定精確寬度整數的標準類型。包括stdint.h標題可分別訪問uint16_tint64_t類型的16位無符號和64位有符號整數,無論​​您在哪種架構上運行。

+1

固定寬度類型只有在架構中有意義時纔會存在;否則他們將不確定。如果你想要真正的可移植性,**不必擔心特定的尺寸,並使用C99最小寬度類型:'uint_least16_t','int_least64_t',... ** – pmg 2011-03-25 18:21:04

+0

@pmg:兩個'uint_least8_t'的總和將是一個有符號或無符號的數量?我認爲除非一個代碼被大量地使用明確的轉換,否則使用'uint_least8_t'而不是'uint8_t'可能會在不支持8位字節的機器上以錯誤行爲取代編譯失敗 - 這並不是完全的改進。 – supercat 2014-01-25 17:42:01

1

改爲使用uint16_t - stdint.h會保證它完全是16位,或者如果架構上沒有可能的16位值,將阻止編譯。

如果您只是想檢查,請考慮使用C_ASSERT(sizeof(T)== 2) - 如果T爲而不是 2字節長,則會導致編譯時錯誤。這樣你就可以知道在每個編譯的二進制文件中T是2個字節(因爲如果它不是出於某種奇怪的編譯器原因,編譯將失敗)。

+0

'C_ASSERT()'在C標準中沒有定義。必須爲編譯器編寫它。 – 2012-03-13 21:30:28