保证数据类型大小

Guaranteeing data type size

本文关键字:数据类型      更新时间:2023-10-16

是否有正确或常规的方法来保证数据类型的大小为 4?

以前我刚刚根据不同数据类型的大小做了一些 typedef 语句,我想知道是否有更好或更传统的方法可以在不同的架构上拥有预定大小的数据类型?

为了解决这个问题,假设我有一个从文件中读取的大量字符数组。我想从这个 char 数组中读取一系列 24 位整数。过去,我将数组转换为具有我所需数据类型大小的数据类型,但是如果没有具有我所需大小的原始数据类型,则此方法将失败。

处理这种情况的最佳方法是什么?

  char x[10] = {1,1,1,1,1,1,1,1,1,1};
  uint32_t* y = (uint32_t*)x;
  for(int i=0; i < 10; i++)std::cout << "y: " << y[i] << "n";
  output:
  y: 16843009
  y: 16843009
  y: 257
  desired output:
  y: 65793
  y: 65793
  y: 65793
   ....
去老

派,读一个字节,读一个字节,读一个字节!

uint32_t read24(unsigned char *& bufp)
{
    uint32_t val;
    val = *bufp++;
    val |= *bufp++ << 8;
    val |= *bufp++ << 16;
    return val;
}

用法:

unsigned char buffer[] = 
{ 0x2A, 0x00, 0x00, 0x9A, 0x02, 0x00, 0x4E, 0x61, 0xBC };
unsigned char * bufp = buffer;
uint32_t A = read24(bufp);
uint32_t B = read24(bufp);
uint32_t C = read24(bufp);

为什么是无符号的char?处理符号扩展的最简单方法。如果使用带符号的char,则必须像这样进行屏蔽:

val = *bufp++ & 0xFF;

以去除多余的符号位。

并注意字节序。根据数据的来源,您可能需要从另一个方向读取所有内容。

固定

宽度类型uint32_t就是为此而设计的。它将由系统上适合的任何原语构造而成。

您可以在<cstdint>或 C++11 之前在 Boost 中找到它可能有用的<boost/cstdint.hpp>. C also provides a '。

如果做不到这一点,char[4]