使用uint32_t而不是unsigned int的实际示例

时间:2014-02-07 07:02:21

标签: c++

我正在寻找一个实际示例,我必须使用uint32_t而不是unsigned int来表示桌面应用程序。你能否提供C++代码和:

  1. 解释现实世界的情景;我真的关注这里的一个实际例子。没有什么太理论化了;
  2. 精确定位目标架构+编译器;
  3. 解释为什么它可以与uint32_t一起使用,并且(最有可能)与unsigned int失败;
  4. 我的主要目标是尽可能轻松地重现它。

2 个答案:

答案 0 :(得分:5)

想象一下,您编写了一个可移植程序(即它可以在各种不同类型的计算机上编译和运行),并且您的程序需要能够保存和加载数据文件。

为简单起见,我们会说程序的数据文件只需要包含一个整数。因此,当用户单击“保存”时,程序fwrite()将unsigned-int放入文件中。由于您在64位模式下运行在现代Intel机器上,因此生成的文件长度为8个字节(因为该平台上的sizeof(unsigned int)== 8)。

现在您将数据文件通过电子邮件发送给您的朋友,供他使用。你的朋友加载到文件中,但他在旧的Pentium Pro机器上编译并运行你的程序。当他运行你的程序时,它尝试按照预期读取单个int,但是在Pentium Pro上,sizeof(unsigned int)== 4,所以程序只读取4个字节而不是全部8个。现在他的程序是显示不正确的数据,因为它只读取文件的一半。这不好。

另一方面,如果您在保存/加载代码中指定了写入/读取uint32_t而不是unsigned int,则可以放心,无论采用何种体系结构,文件总是长度为4个字节。程序编译为。因此,通过使用uint32_t而不是unsigned int,您可以更轻松地编写和读取数据文件。

(请注意,在现实生活中你还想使用htonl()和ntohl(),这样你的数据文件对于Big Endian和Little Endian机器都是一样的,但这是一个单独的问题)

答案 1 :(得分:4)

unsigned int可能不是32位,它取决于程序运行的计算机体系结构。

uint32_t在库中定义,typedef为32位整数。

这种做法更多的是便携性。即使目标平台没有定义uint32_t,您也可以轻松typedef到32位整数类型。