10

那么,您知道 char 类型的原语如何具有 1 个字节的大小吗?我将如何制作具有自定义大小的图元?所以就像我制作一个大小为 16 的 int 而不是一个大小为 4 字节的 int。有没有办法做到这一点?有办法解决吗?

4

4 回答 4

6

这取决于你为什么这样做。通常,您不能使用少于 8 位的类型,因为这是体系结构的可寻址单元。但是,您可以使用结构来定义不同的长度:

struct s {
  unsigned int a : 4;  // a is 4 bits
  unsigned int b : 4;  // b is 4 bits
  unsigned int c : 16; // c is 16 bits
};

但是,不能保证该结构将是 24 位长。此外,这可能会导致字节序问题。在可能的情况下,最好使用与系统无关的类型,例如 uint16_t 等。您还可以使用按位运算符和位移位来非常具体地旋转事物。

于 2010-04-21T01:48:56.627 回答
5

通常,您只需创建一个表示您感兴趣的数据的结构。如果它是 16 字节的数据,要么它是许多较小类型的集合,要么您正在使用具有本机 16 字节整数类型的处理器。

如果您试图表示非常大的数字,您可能需要找到一个处理任意大小数字的特殊库。

于 2010-04-21T01:49:26.797 回答
3

在 C++11 中,有一个很好的解决方案:std::aligned_storage。

#include <memory>
#include <type_traits>

int main()
{
    typedef typename std::aligned_storage<sizeof(int)>::type memory_type;
    memory_type i;
    reinterpret_cast<int&>(i) = 5;
    std::cout << reinterpret_cast<int&>(i) << std::endl;

    return 0;
}

它允许您在堆栈上声明一块未初始化的存储。

于 2017-07-02T06:12:10.713 回答
1

如果你想创建一个新类型,typedef 它。如果您希望它的大小为 16 字节,请 typedef 一个包含 16 字节成员数据的结构。请注意,编译器通常会在您身上填充东西以匹配您的系统对齐需求。一个 1 字节的结构很少不小心保留 1 个字节。

于 2010-04-21T02:13:31.003 回答