保证数据类型大小

时间:2015-06-10 18:19:30

标签: c++ arrays types

是否有正确或传统的方法来保证数据类型的大小为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
   ....

2 个答案:

答案 0 :(得分:0)

去读旧学并读取一个字节,读取一个字节,读取一个字节字节的字节!

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;

剥去额外的符号位。

注意endian。根据您的数据来源,您可能必须从另一个方向阅读所有内容。

答案 1 :(得分:0)

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

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

失败,char[4]