【问题标题】:Guaranteeing data type size保证数据类型大小
【发布时间】:2015-08-26 04:12:33
【问题描述】:

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

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

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

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

  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 不够好?
  • 要详细说明@barakmanos 的评论,&lt;cstdint&gt; 中有大量固定宽度的整数类型
  • 如果我从 24 位整数列表中读取 32 位整数,我的所有值都不会关闭吗?
  • @barakmanos uint32_t 存在,如果它可以有 32 位,但由于 CHAR_BIT != 8 而可能不是 4 字节,尽管这是一种短暂的可能性。
  • sizeof (unsigned char[4]) == 4,保证。 sizeof (uint32_t) == 32 / CHAR_BIT 如果 uint32_t 存在;如果CHAR_BIT == 8(很可能是这种情况),则为 4。

标签: c++ arrays types


【解决方案1】:

走老路,读一个字节,读一个字节,读一个字节-字节-字节!

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);

为什么没有签名chars?处理符号扩展的最简单方法。如果您使用签名的chars,则必须像这样进行屏蔽:

val = *bufp++ & 0xFF;

去除多余的符号位。

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

【讨论】:

    【解决方案2】:

    固定宽度类型uint32_t 就是为此而设计的。它将根据您系统上适用的任何原语构建。

    您可以在 &lt;cstdint&gt; 或 C++11 之前的 Boost 中找到它,如 &lt;boost/cstdint.hpp&gt;. C also provides a` 可能有用。

    失败了,char[4]

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 1970-01-01
      • 2011-03-14
      • 2016-10-11
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      相关资源
      最近更新 更多