簡體   English   中英

uint8、uint16 和 uint32 的大小?

[英]size of uint8, uint16 and uint32?

我正在處理使用uint8 (1 字節寬的無符號整數)、 uint16 (2 字節寬的無符號整數)、 uint32 (4 字節寬的無符號整數)等類型的代碼。

我的問題是:

  • uint8char大小相同嗎?

  • uint16int大小相同嗎?

  • uint32long大小相同嗎?

  • uint64double的大小是否相同?

例如:

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。這是為什么呢?

uint8uint16uint32uint64可能是 Microsoft 特定的類型。

從 1999 標准開始,C 支持具有相似含義的標准 typedef,在<stdint.h>定義: uint8_tuint16_tuint32_tuint64_t 我將假設 Microsoft 特定類型的定義類似。 Microsoft 確實支持<stdint.h> ,至少從 Visual Studio 2010 開始,但較舊的代碼可能使用uint8等。

預定義類型charshortint等的大小因 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_tdoubledouble是浮點類型。)

目前還不清楚您如何計算大小(“調試模式下的大小”?”)。

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM