2011-05-25 156 views
1

讓我們假設我有一個C腳本,並且聲明瞭一些unsigned int。然後,我編寫一個while循環,它會自動增加這些值並將其打印出來:在用戶將其從命令行中停下來之前沒有限制。一旦我達到非常高的數字(20億),計算機就從數百億開始計算。我怎樣才能防止這一點?看,我可以輕鬆地鍵入,比如說,「99999999999999」,而不會造成任何崩潰:爲什麼我不能在我的32位終端上執行此操作?我已經嘗試了很長很長的int,簽名和未簽名,但我仍然有這個問題。下面是截圖:http://img577.imageshack.us/img577/6558/schermata20110524a01012.pngsigned/unsigned int

感謝, J.

+2

C不是一種腳本語言。 ;) – 2011-05-25 01:58:32

+2

您可能正在使用未簽名的存儲,但您將其打印爲已簽名。如果您使用printf使用%u而不是%i或%d。 – ughoavgfhw 2011-05-25 02:01:34

回答

2

計算機有沒有符號/無符號,它的值的解釋事情的概念。取決於您如何定義數據類型,相同的值可以解釋爲-1或解釋爲65535。在你的情況下 - 循環永遠不會進入負數,因爲對於那種數據類型 - 沒有這樣的事情。相反,正範圍將大於signed int

至於截圖 - 你打印如何?例如,如果您使用%d打印 - 則會將值解釋爲signed。改用%u來讓程序將值解釋爲unsigned

2

你打印出來如何?您是否使用printf("%u", i)printf("%i", i)

%i會認爲int是有符號的,即使它不是。要打印一個無符號整數,請使用%u

+0

printf(「%i」,i) – Joseph 2011-05-25 02:03:05

+0

'%i'只適用於'int','signed int'和'short'。對於'unsigned int',你應該使用'%u',對於'unsigned long long','%llu'(但是請注意某些版本的Windows使用非標準說明符) – Thanatos 2011-05-25 02:06:11

+0

親切 - 謝謝!多大的unsigned int可以是多少?我想存儲一個可能容易超過20億的值! – Joseph 2011-05-25 02:08:57

1

一個32位數的範圍有限,因爲它只有32位。您不能以32位存儲60-70等位數。

您可以使用類似unsigned long long的東西,它可能是64位,因此具有更大的範圍,但它仍然會有一個限制。 (2^64,但它是一個非常大大數)。如果您確實需要「無限制」,請查看bigint庫,例如GMP。


編輯:如其他海報指出,要確保你使用你的格式字符串正確的轉換符來printf

  • %d%iintsigned intshort
  • %uunsigned intunsigned short
  • %lluunsigned long long
  • %lld%llilong long

注意某些版本的Windows都爲long long各類非標格式說明。

+0

我試圖從int更改爲long long int,但結果與上面張貼的屏幕截圖相同:( – Joseph 2011-05-25 02:03:54

+0

@Joseph:查看有關使用'printf'的轉換說明符的帖子,這可能是爲什麼您的用'long long int'嘗試失敗。 – Thanatos 2011-05-25 02:08:12

0

部分是關於如何打印價值。

如果你說

printf("%d\n", your_unsigned_int); 

那麼即使int是無符號的,(假設你沒有一個編譯器,這樣的事情發出警告,)printf將把它作爲一個簽署 INT(因爲這就是%d的含義)。

嘗試%u而不是%d

一旦你修好了,意識到在一個32位系統上,一個int(有或沒有)通常只有32位大小,因此只能保持大約40億的值。如果你想要比這更大的值,你需要一個更大的類型(如long long)。如果你這樣做,你需要改變你的格式字符串到"%ull\n"(或"%llu"?我忘記),或者誰知道你會得到什麼。

相關問題