整數平方一定大於零嗎?

2021-09-22 22:45:59 字數 2914 閱讀 6856

嘿,悄咪咪的問你個問題,你覺得整數平方一定大於零嗎?

(那不然呢,整數的平方還能小於零不成)

哎,別急著回答

我們先來跑一段c語言**來看看:

int sq(int x)

int main(int argc, char *ar**)

return 0;

}

執行結果如下:

./sq 3

sq(3) = 9

./sq 30000

sq(30000) = 900000000

./sq 50000

sq(50000) = -1794967296

最後乙個結果居然是:sq(50000) = -1794967296(咦?這個五萬的平方為什麼會是個負數???)

(明明前面的結果是正確的,為什麼到這裡畫風就突然說變就變了?)

別急別急別急!!!

讓我們先來看乙個**

型別儲存大小

值範圍char

1 位元組

-128 到 127 或 0 到 255

unsigned char

1 位元組

0 到 255

signed char

1 位元組

-128 到 127

int2 或 4 位元組-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647

unsigned int

2 或 4 位元組

0 到 65,535 或 0 到 4,294,967,295

short

2 位元組

-32,768 到 32,767

unsigned short

2 位元組

0 到 65,535

long

4 位元組

-2,147,483,648 到 2,147,483,647

unsigned long

4 位元組

0 到 4,294,967,295

也就是說(int)型資料最多只能把

大於等於 -2,147,483,648且小於等於 2,147,483,647

的數字儲存在計算機裡面。

但為什麼會這樣呢?

因為在計算機內部,無論任何資料,都是以01儲存的

乙個0或是乙個1就佔據了乙個位元(bit)

而 通過下面的轉換後就變成了我們所熟悉的mb、gb等單位

1b(byte) = 8bit;

1kb = 1024b(byte);

1mb = 1024kb(byte);

1 gb = 1024 mb;

再看剛才的**, (int)型資料是以4個位元組(byte)的大小、二進位制的形式儲存在我們的計算機裡面,而4個位元組 = 32位元。int型資料是以二進位制補碼的形式儲存在我們的計算機裡面。

理論上4個位元組的零一串行能夠表示的最大的數是:

2^32 - 1 = 4,294,967,295

但在這一串零一串行中,它的最高位充當了符號位,符號位為0表示該數為正,符號位為1則表示該數字負,所以真正影響數字大小的是這個符號位後面的31個位元的零一串行,所以 (int)型資料的範圍就是從-2,147,483,6482,147,483,647

在了解到這些後,我們在反過頭來看**的執行結果:

當運算3 x 3的時候

十進位制的3用二進位制表示就是11,3的平方是9,用二進位制表示是1001

3的平方運算的結果僅用4個位元就可以表示,相較於int型資料所擁有的31個能夠確切表示數字的位元位來說,運算3的平方是絕不會超出它的範圍的。

但是當我們運算5萬的平方的時候它又發生了什麼呢?請看下圖:

5萬用二進位制表示是

1100 0011 0101 0000

它平方的結果用二進位制表示是

1001 0101 0000 0010 1111 1001 0000 0000

由於int型資料最多只有32個位元位可以用來儲存資料,所以恰好能夠把五萬的平方的運算結果儲存進去。

但是,能夠用於精確表示數字的只有後面的31個位元位。

並且,在五萬的平方的二進位制表示中,它的最高位為1,這就意味著計算機會把它當成乙個負數來進行讀取,從而展現在我們面前的就是乙個負數,而不是乙個正數。

最後,回到我們剛剛開始的問題:整數平方一定大於零嗎?

或許,在自然界中,上述命題肯定是成立的,但是放在計算機的世界就不一樣了。我們應加深自己對計算機的了解,一些在自然界的真命題遇到計算機後就不一定的,我們在編寫**的時候,應該時時刻刻注意這些與我們日常認識不一樣的地方,才能夠使我們的**更為健壯。

多執行緒一定快嗎?

package com.itmyhome.test 測試併發執行和序列執行的效率 author tracymcgrady public class concurrencytest catch interruptedexception e serial 併發執行 private static void...

多執行緒一定快嗎?

cpu通過給執行緒分配cpu時間片來實現多執行緒執行的,也就是時間片輪轉機制,cpu分配給每個執行緒的時間片非常短,所以我們才會感覺多個執行緒是同事執行的。cpu在執行執行完乙個時間片後會切換到下乙個任務,切換之前會儲存上乙個任務的狀態,以便下次切換回這個任務的時候可以載入到這個任務的狀態,所以任務...

SQL IN 一定走索引嗎?

in 一定走索引嗎?那當然了,不走索引還能全部掃瞄嗎?好像之前有看到過什麼exist,in走不走索引的討論。但是好像看的太久了,又忘記了。哈哈,如果你也忘記了mysql中in是如何查詢的,就來複習下吧。問題要從之前的統計店鋪數關注人數說起 select shop id,count user id a...