2013-10-25 46 views
0

此行printf ("Random[%d]= %u\n", i, rand());產生一個隨機整數大多是1位,但這樣做的printf ("Random[%d]= %u\n", i, rand()%1000000);當它產生6位整型,生成10位有符號整數

試圖生成一個10位的int錯誤時「警告:格式「% u'需要類型爲'unsigned int'的參數,但參數3的類型爲'long long int'[-Wformat]「。

那麼有沒有辦法產生一個隨機的10位有符號整數?

+1

產生兩個整數,位位移他們中的一個在左,而結合? – Ashalynd

+3

你確定你不混合「位」和「數字」的含義嗎? –

+1

'rand()&1023' – CodesInChaos

回答

2

您將顯式或隱式地傳遞給printf,這會導致sa「long long」或「unsigned long long」,這就是爲什麼您會收到警告 - 但稍後會更多;

生成一個10位的隨機數,你需要切換到64位 - 這麼長的時間;

unsigned long long randomvalue; 
randomvalue = random(); 
randomvalue <<= 16; // just picked 16 at random 
randomvalue ^= random(); // you could also use + but not "or"; 
randomvalue %= 10000000000ULL; 

你得到的警告是因爲你傳遞的第三個參數printf功能long long類型的值,但你仍然使用"%u"作爲格式,這使得printf期望unsigned int類型的值。

要取消警告,請將格式更改爲"%lld"

它不會幫助您創建一個10位數字高於2147483647不過,因爲rand返回int迄今最多爲32位,即使是在64位平臺。價值2147483647來自哪裏?如果是有符號的32位整數,則爲最高正值。

+0

你預設了一個函數random(),它返回至少16個隨機位(+1表示「不要使用OR」) - 我會坐下來讓別人咀嚼那個一)。然而,OP使用'rand()'和* vide *關於Bits,Bytes,Digits的混淆,值得強調的是'rand()'只能*保證*在** 15 **位是隨機的RAND_MAX所說的完全取決於編譯器(好的,*不是*編譯器,但是爲了簡單起見,我們說它的確如此))。 – usr2564301

+0

@Jongware我的答案中的代碼來自編輯而非我。 –

1

它不適合在一個Int32(檢查臺看如何int定義)

在一個無符號INT32,最大值爲2^32 = 4,294,967,296。所以,當你做rand % 1000000000010000000000long所以%被計算爲long操作(可提供這種類型的結果)

+0

順便說一句:你應該清楚地區分「位」和「數字」。只有在處理二進制格式時它們纔是相同的。 – SJuan76