嘿,悄咪咪的問你個問題,你覺得整數平方一定大於零嗎?
(那不然呢,整數的平方還能小於零不成)
哎,別急著回答
我們先來跑一段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
的數字儲存在計算機裡面。
但為什麼會這樣呢?
因為在計算機內部,無論任何資料,都是以0和1儲存的
乙個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,648到2,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...