uint8,uint16和uint32的大小?

时间:2014-04-03 15:48:09

标签: c visual-studio

代码库使用数据类型,如uint8 [1字节宽无符号整数],uint16 [2字节宽无符号整数],uint32 [4字节宽无符号整数]等。

问题: uint8和char一样? uint16与int相同? uint32和long一样? uint64与double ??

相同

例如:uint8 c [20]; //那么sizeof(c)应该是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.为什么它显示为那样??

2 个答案:

答案 0 :(得分:13)

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-s补码表示。

虽然uint32_t可能与unsigned int相同,但您不应该假设。当你需要一个至少16位宽的无符号整数类型时,请使用unsigned int,这是&#34; natural&#34;当前系统的大小。当需要一个正好为32位宽的无符号整数类型时,请使用uint32_t

(不,uint64uint64_tdouble不同; double是浮点类型。)

答案 1 :(得分: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等等。