我在玩我的玩具語言設計,我有一些問題。我希望它有位長指定的變量。所以,舉個例子,像下面這樣聲明變量:在8位塊中使用變量的好方法是什麼?
byte value;
two_bytes value;
現在,這是我的問題。我試圖爲C語言(或C++)做一個解釋器。我對C/C++的理解是,它們的變量類型保證至少是最小尺寸,但它們可以更大(即,字符將至少爲8位,但某些實現將具有16位字符)。
如何在C/C++中編寫只處理特定位數的解釋器?是否只有一種方法來創建布爾數組或爲字符類型設置位域?
我在玩我的玩具語言設計,我有一些問題。我希望它有位長指定的變量。所以,舉個例子,像下面這樣聲明變量:在8位塊中使用變量的好方法是什麼?
byte value;
two_bytes value;
現在,這是我的問題。我試圖爲C語言(或C++)做一個解釋器。我對C/C++的理解是,它們的變量類型保證至少是最小尺寸,但它們可以更大(即,字符將至少爲8位,但某些實現將具有16位字符)。
如何在C/C++中編寫只處理特定位數的解釋器?是否只有一種方法來創建布爾數組或爲字符類型設置位域?
stdint頭是你所需要的:
#include <cstdint>
std::int32_t x; // 32 bits signed
std::uint16_t y; // 16 bits unsigned
如果包括'cstdint',那麼你應該使用'STD :: int32_t'。該語言允許但不要求實現提供全局名稱空間中的類型,這使得您的示例不可移植。 –
如果你想原始類型,那麼大多數編譯器應該提供<stdint.h>
(或<cstdint>
),其中包含的類型,如uint8_t
,uint16_t
,uint32_t
。
如果你想要模糊的尺寸(例如uint13_t
),你可能最好使用更大的標準尺寸。如果您需要節省空間,您可以查看std::bitset
,但對於大多數操作而言,這可能會大幅減慢。
通常你可以使用一個unsigned int持有的說,8位的東西,並仍然使用位運算符就可以了,如移(>>)。控制長度只是某種插入的邏輯。 8位不能大於2^8th - 1(255)。
如果我得到你的權利,
#include <stdint.h>
uint8_t my_byte_var;
int16_t my_signed_2byte_var;
可能是你的路要走......
如果你不確定現有的位長,並希望它傳遞到另一個值解析它是這樣,你可以簡單地做到以下幾點:
char a;
uint8_t b[4];
b = a;
現在,您可以訪問取決於長度,高達32位的最大尺寸的部件,雖然焦炭永遠不會是32位,我只是爲了例子而使用它。
問題是爲什麼你想節省內存。你的目標是extremeley嵌入式應用程序嗎?從一個字節中獲得一位的時間幾乎等於得到一個8位無符號字符。您可以直接使用的字符在 , char位; bit = get(3); if(bit) ... 若要在字符中使用某個位,您甚至必須對其進行掩碼。 – schoetbi
如果給定類型的尺寸比所需要的尺寸大,爲什麼它會成爲問題? –
您的偏好是C還是C++? – glglgl