首页 文章

uint8,uint16和uint32的大小?

提问于
浏览
9

代码库使用数据类型,如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 回答

  • 3

    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 必须是无符号整数类型's exactly 8 bits wide. It'可能是 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 类型需要使用二进制补码表示 .

    虽然 uint32_t 可能与 unsigned int 相同,但您不应该假设这一点 . 当需要无符号整数类型's at least 16 bits wide, and that'是当前系统的"natural"大小时,请使用 unsigned int . 当需要一个正好为32位宽的无符号整数类型时,请使用 uint32_t .

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

  • 13

    目前还不清楚你是如何计算尺寸的(“调试模式下的尺寸”?) .

    使用 printf()

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

    通常你会使用 %zu 打印 size_t 值(类型 sizeof 返回),但是如果你're using a pre-C99 compiler like Visual Studio that won'工作 .

    您需要在代码中找到 typedef 语句,用于定义自定义名称,如 uint8 等;那些不是标准的,所以这里的任何人都不知道它们是如何在你的代码中定义的 .

    新的C代码应该使用 <stdint.h> ,它会给你 uint8_t ,依此类推 .

相关问题