【问题标题】:size of uint8, uint16 and uint32?uint8、uint16 和 uint32 的大小?
【发布时间】:2014-04-03 15:48:08
【问题描述】:

我正在处理使用 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。这是为什么呢?

【问题讨论】:

  • 应该是typedef unsigned char uint8;,在中使用uint8_t、uint16_t、uint32_t。
  • sizeof c 是 50?应该是20 * sizeof(unsigned int),不能是50。
  • 如何将int转换成char得到char中的最终解??
  • 代码示例与前面的文字相矛盾:它包含typedef unsigned int uint32typedef unsigned int uint8,非常混乱。请澄清。
  • 请澄清“调试模式下c的大小为50”。 50 是否应该是十六进制数(即 80 十进制)?另外,它与代码有任何关系吗?

标签: c visual-studio


【解决方案1】:

uint8uint16uint32uint64 可能是 Microsoft 特定的类型。

从 1999 年标准开始,C 支持具有相似含义的标准 typedef,在 &lt;stdint.h&gt; 中定义:uint8_tuint16_tuint32_tuint64_t。我将假设 Microsoft 特定类型的定义类似。 Microsoft 确实支持 &lt;stdint.h&gt;,至少在 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 位。

此外,&lt;stdint.h&gt; 定义了对应的有符号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_tdouble 不同;double 是浮点类型。)

【讨论】:

    【解决方案2】:

    目前还不清楚您是如何计算大小的(“调试模式下的大小”?”)。

    使用printf():

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

    通常你会用%zu 打印一个size_t 值(这是sizeof 返回的类型),但如果你使用的是像Visual Studio 这样的C99 之前的编译器,那将无法工作。

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

    新的 C 代码应该使用&lt;stdint.h&gt;,它给你uint8_t等等。

    【讨论】:

    • 要获得 c 的值,我该怎么办??最后我想将值存储在 c[3];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2014-06-27
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2016-08-12
    相关资源
    最近更新 更多