2013-12-15 86 views
4

您如何(如果可能)通過整數大小定義類型?例如,如果我想製作一個長度爲3個字節的類型,我該如何完成這樣的事情? (我知道這是不正確的)基於整數大小的鑄造指針類型(C99)

typedef int24_t 3; 

我想寫一個廣義函數,它接受一個字符串參數包含多個號碼,並存儲號碼的指針,作爲另一個參數傳遞。

但是我想讓它可以傳遞一個數字參數,它決定了存儲數字的變量類型有多大:即如果它是1,那麼類型可以是char,如果它是4,則類型可以是int等等

我知道,它可能只存儲在一個臨時固定大小的變量的數量,然後只根據請求的大小複製相關的字節到指針,但我希望代碼是便攜式的我不想因爲Endianness而陷入混亂,因爲我在過去遇到了麻煩。

感謝

+1

如果你希望* data *是可移植的,那麼你必須處理endianess,這是無法解決的。如果* data *只保留在一個平臺上(不管它是哪個平臺),那麼您不必擔心這一點。 –

+0

很可能沒有24位整數類型。由於'typedef'只爲現有類型創建一個別名,而不是新類型,所以沒有辦法解決 - 如果你真的需要它是一個整型。 –

回答

3

您可以使用一個結構,它不是優雅,但聽起來就像你在找什麼。 請注意,您必須將結構對齊定義爲1個字節。你也只限於64位。

typedef struct Int24 { 
    int value : 24; 
} Int; 

typedef struct UInt24 { 
    unsigned value : 24; 
} UInt24; 

typedef struct Int48 { 
    long long value : 48; 
} Int48; 

隨着模板:

template<int bytes> struct Int { 
    long long value : bytes * 8; 
}; 
typedef Int<1> Int8; 
typedef Int<6> Int48; 

隨着宏:

#define DECL_INT(n)   \ 
    typedef struct _Int##n { \ 
     long long value : n; \ 
    } Int##n 

// declaration of type 
DECL_INT(48); // produces Int48 

// usage 
Int48 i48; 
+0

刪除72bit int。漫長的一天:( – egur

+0

我認爲是做這樣的事情,但我想要一個泛化,所以我沒有必要爲每個整數的大小定義一個結構 – joelyboy94

+0

添加替代與模板 – egur

1
 struct smallerint 
     { 
     unsigned int integer:24; //(24=24bits=3bytes) 
     }; 

     typedef struct smallerint int24_t; 
0

如果我理解你想好做什麼,如果你想一個很好的泛化函數,我會使用鏈表的字節。也許你應該看看bigint的實現。