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位,我只是爲了例子而使用它。

相關問題