3

我在玩我的玩具语言设计,我有一些问题。我希望它有位长指定的变量。所以,举个例子,像下面这样声明变量:在8位块中使用变量的好方法是什么?

byte value; 
two_bytes value; 

现在,这是我的问题。我试图为C语言(或C++)做一个解释器。我对C/C++的理解是,它们的变量类型保证至少是最小尺寸,但它们可以更大(即,字符将至少为8位,但某些实现将具有16位字符)。

如何在C/C++中编写只处理特定位数的解释器?是否只有一种方法来创建布尔数组或为字符类型设置位域?

+0

问题是为什么你想节省内存。你的目标是extremeley嵌入式应用程序吗?从一个字节中获得一位的时间几乎等于得到一个8位无符号字符。您可以直接使用的字符在 , char位; bit = get(3); if(bit) ... 若要在字符中使用某个位,您甚至必须对其进行掩码。 – schoetbi

+0

如果给定类型的尺寸比所需要的尺寸大,为什么它会成为问题? –

+0

您的偏好是C还是C++? – glglgl

回答

5

stdint头是你所需要的:

#include <cstdint> 
std::int32_t x; // 32 bits signed 
std::uint16_t y; // 16 bits unsigned 
+1

如果包括'cstdint',那么你应该使用'STD :: int32_t'。该语言允许但不要求实现提供全局名称空间中的类型,这使得您的示例不可移植。 –

3

如果你想原始类型,那么大多数编译器应该提供<stdint.h>(或<cstdint>),其中包含的类型,如uint8_tuint16_tuint32_t

如果你想要模糊的尺寸(例如uint13_t),你可能最好使用更大的标准尺寸。如果您需要节省空间,您可以查看std::bitset,但对于大多数操作而言,这可能会大幅减慢。

0

通常你可以使用一个unsigned int持有的说,8位的东西,并仍然使用位运算符就可以了,如移(>>)。控制长度只是某种插入的逻辑。 8位不能大于2^8th - 1(255)。

3

如果我得到你的权利,

#include <stdint.h> 
uint8_t my_byte_var; 
int16_t my_signed_2byte_var; 

可能是你的路要走......

0

如果你不确定现有的位长,并希望它传递到另一个值解析它是这样,你可以简单地做到以下几点:

char a; 
uint8_t b[4]; 

b = a; 

现在,您可以访问取决于长度,高达32位的最大尺寸的部件,虽然焦炭永远不会是32位,我只是为了例子而使用它。

相关问题