2014-04-03 1313 views
6

代碼庫使用的數據類型等UINT8 [1字節寬的無符號整數],UINT16 [2字節寬的無符號整數],UINT32 [4字節寬的無符號的整數]等uint8,uint16和uint32的大小?

問題: UINT8是相同字符? ? uint16與int相同 uint32與長相同? uint64與雙重相同?

例如:uint8 c [20]; //那麼sizeof(c)應該是20-不是嗎? 我寫在視覺工作室小的代碼,如下所示:

#include <stdio.h> 
#include <string.h> 
typedef unsigned int uint32; 
typedef unsigned int uint8; 
int main() 
{ 
    double a = 1320.134; 
    uint32 b; 
    uint8 c[20]; 
    b = (unsigned int)a; 
    c[3] = b; 
    printf("value is %d", c[3]); 
    return 1; 
} 

但是C的在調試模式下的大小爲50。爲什麼示出這樣的??

+0

應該是'的typedef無符號字符UINT8;',使用uint8_t,uint16_t,uint32_t的在。 – BLUEPIXY

+3

'sizeof c'是50?它應該是'20 * sizeof(unsigned int)',它不能是50. – ajay

+0

如何將int轉換爲char來得到char?中的最終解決方案? – user3458454

回答

3

這是很清楚你是如何計算的大小(「大小在調試模式」「?)

使用printf()

printf("the size of c is %u\n", (unsigned int) sizeof c); 

通常你會打印size_t值(這是類型sizeof返回)與%zu,但如果您使用Visual Studio之前的C99編譯器將不起作用

您需要查找typedef語句在您的代碼中定義像uint8等自定義名稱;那些不是標準的,所以沒人在這裏可以知道它們是如何在你的代碼中定義的

新的C代碼應該使用<stdint.h>,它給你uint8_t等。

+0

爲了得到c的值,我該怎麼做?最後我想把值存儲在c [3]中; – user3458454

9

uint8uint16,uint32uint64可能是特定於Microsoft的類型。

作爲1999標準的,C支持標準的typedef具有類似的含義,在<stdint.h>定義:uint8_tuint16_tuint32_t,和uint64_t。我假設微軟特定類型的定義是相似的。 Microsoft確實支持<stdint.h>,至少從Visual Studio 2010開始支持,但舊版代碼可能會使用uint8等。

預定義類型char,0 short,int等的尺寸從一個C實現到另一個實例變化。 C標準具有某些最低要求(char至少爲 8位,shortint至少爲16,long至少爲32,並且該列表中的每種類型至少與先前類型一樣寬),但允許一些靈活性。例如,我已經看到了系統,其中int是16,32或64位。

char差不多總是正好8位,但允許更寬。而普通的char可能是有符號的或無符號的。

uint8_t被要求是一個無符號整數類型,其正好是8位寬。它很可能是unsigned char的typedef,儘管如果普通的char恰好是無符號的,它可能是純粹的char的typedef。如果沒有預定義的8位無符號類型,則根本不會定義uint8_t

類似地,每個uintN_t類型都是一個無符號類型,正好是N位寬。

此外,<stdint.h>定義對應簽署intN_t類型,以及int_fastN_tint_leastN_t類型是至少指定的寬度。

[u]intN_t類型保證沒有填充位,所以每個類型的大小恰好爲N位。簽署的intN_t類型需要使用2的補碼錶示法。

雖然uint32_t可能與unsigned int相同,例如,您不應該假設那。當您需要至少16位寬的無符號整數類型時,使用unsigned int,這是當前系統的「自然」大小。當你需要一個32位寬的無符號整數類型時,使用uint32_t

(不,uint64uint64_t是不一樣的double; double是一個浮點型。)

+1

downvoter會照顧評論嗎? –