[英]size of uint8, uint16 and uint32?
我正在處理使用uint8
(1 字節寬的無符號整數)、 uint16
(2 字節寬的無符號整數)、 uint32
(4 字節寬的無符號整數)等類型的代碼。
我的問題是:
uint8
和char
大小相同嗎?
uint16
和int
大小相同嗎?
uint32
和long
大小相同嗎?
uint64
和double
的大小是否相同?
例如:
uint8 c[20];
這個的大小不應該是20嗎?
我在visual studio中寫了一些代碼:
#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。這是為什么呢?
uint8
、 uint16
、 uint32
和uint64
可能是 Microsoft 特定的類型。
從 1999 標准開始,C 支持具有相似含義的標准 typedef,在<stdint.h>
定義: uint8_t
、 uint16_t
、 uint32_t
和uint64_t
。 我將假設 Microsoft 特定類型的定義類似。 Microsoft 確實支持<stdint.h>
,至少從 Visual Studio 2010 開始,但較舊的代碼可能使用uint8
等。
預定義類型char
、 short
、 int
等的大小因 C 實現而異。 C 標准有一定的最低要求( char
至少為8 位, short
和int
至少為 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_t
和int_leastN_t
類型。
[u]intN_t
類型保證沒有填充位,因此每個類型的大小正好是 N 位。 有符號intN_t
類型需要使用 2 的補碼表示。
例如,盡管uint32_t
可能與unsigned int
相同,但您不應假設。 當您需要一個至少 16 位寬的無符號整數類型時使用unsigned int
,這是當前系統的“自然”大小。 當您需要正好為 32 位寬的無符號整數類型時,請使用uint32_t
。
(不, uint64
或uint64_t
與double
; double
是浮點類型。)
目前還不清楚您如何計算大小(“調試模式下的大小”?”)。
使用printf()
:
printf("the size of c is %u\n", (unsigned int) sizeof c);
通常,您會使用%zu
打印一個size_t
值(這是sizeof
返回的類型),但是如果您使用的是像 Visual Studio 這樣的 C99 之前的編譯器,它將無法工作。
您需要在代碼中找到定義自定義名稱(如uint8
等)的typedef
語句; 這些不是標准的,所以這里沒有人知道它們是如何在您的代碼中定義的。
新的 C 代碼應該使用<stdint.h>
它給你uint8_t
等等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.