2015-05-08 181 views
2

是否可以聲明一個非常大的數字的位域,例如位長大於長的?

struct binfield{ 
    uber_int field : 991735910442856976773698036458045320070701875088740942522886681; 
}wordlist; 

只是爲了澄清,我不是試圖代表在256bit的這個數字,這就是我想要多少位使用。或者,也許在我的電腦中沒有那麼多位?

+1

有沒有一起在地球上的所有計算機,許多位。 – interjay

+0

@interjay世界上所有的計算機沒有超過256位? – Philipp

+1

@ Philipp世界上所有的計算機都沒有991735910442856976773698036458045320070701875088740942522886681位。 – interjay

回答

2

C不支持任意大小的數字數據類型。您只能使用編譯器提供的整數大小,並且如果希望代碼具有便攜性,則最好遵守標準化類型char(8位),short(16位)和long(32位)和long long(64位)。

但是你可以做的是創建一個char[]。字符總是至少8位(並且不超過8位,除非在某些非常奇特的平臺上)。因此,您可以使用一個char數組來存儲儘可能多的位值,因爲您可以負擔得起內存。但是,如果要將char數組用作位域,則需要一些樣板代碼才能訪問正確的字節。

例如,爲了獲得一個字符數組的位n的值,使用

bitfield[n/8] >> n%8 & 0x1 
+1

有一些歷史平臺,其中'char'不是* 8位,並且規範沒有說'char'必須是8位。然而,無論'char'中的位數是多少,'sizeof(char)'總會給你'1'。 –

+2

要添加到@ JoachimPileborg的評論,並在您關心非8位'char'的小概率時:C標準說'char'將始終爲至少8位,並且char中的位數'在'CHAR_BIT'宏中提供(來自'limits.h')。 POSIX確實指出'CHAR_BIT'正好是8。 –

+0

字符技術似乎是正確的方式去實現它,雖然我意識到存儲可能會有一段時間,直到摩爾定律趕上 – veta