型態 unsigned int
C 語言是我認為程式語言的一項重要基礎語言
對於記憶體、型態、資料結構..等,都有很強的內力幫助!
今天在整理以前的文章時,找到那時候學到底層的東西
發現到這一些些剛開始寫程式的容易忽略的東西
型態(type)
以前在寫程式時基本上只要是數字,整數的話一定用 int,浮點數就不用講了 float 啦!
印象中 int 如果我沒記錯的話是 4 個 Byte,想實驗可以用一下 sizeof(int); 這函數印出看看
什麼意思呢!? 以下如果想練內力的可以看下去~
4Byte 代表著 4 * 8bit 也就是 32bit,那代表著說,在電腦的世界裡會有個 32 個位置用來記錄 0、1
那這 32 個位置到底可以擺多大的數字呢?
用簡單的符號表示一下這 32 個位置:
如:-------- -------- -------- --------
舉例,數字 1 的話,用以電腦角度看
00000000 00000000 00000000 00000001
那如果是數字 512 呢!?
00000000 00000000 00000001 00000000
至於怎麼由 2 進位轉成 10 進位 或者 轉成 16 進位!?
請大家自行 google 吧~!
關鍵字:二的補數法(2's complement)
那既然說到二的補數法,就不得不提到在(二進位+二的補數法)的世界!
在這個世界裡,第一個位數通常是拿來當正負號區別!
舉個以 -512 這個十進位數字來看,那二進位便是:
11111111 11111111 11111111 00000000
第一個 bit 是 1,所以可知這數字必是負數
那至於怎轉換!? 一樣去 Google 吧!
在這邊先簡單說,就是先將 512 轉二進位,然後再加 1
若是要從二進位轉換至十進位,那就反過來先減 1 接著轉十進位 最後加上負號!
那.. 為什麼提到這個呢!?
因為這會牽扯到 int 究竟可以存入多大的數!
因為若是第一個 bit 是拿來當判斷正負號依據的話
那也就是說只剩下 31 個 bit 可以用囉!
那也更是說只剩這 31 個位置,可以擺放 0、1 產生出不同的變化囉!
那有幾種變化?
依排列組合便可以知道是 2 的 31 次方,也就是 2147483648
那算一算也就是說 int 最大數字可以是 2147483648 囉!!???
但! 答錯!
2147483648 只能說有這麼多種變化,而其中還包含著 0
所以!!! 也就是說 是 0~2147483647 才是!!
所以!!! 答案出來了!
int 正常的話,最大可以存的數字是 2147483647
那麼.. 十進位 2147483647 轉成二進位會是長怎樣?
就是:01111111 11111111 11111111 11111111
那若是.. 如果.. 再給他加 1 會怎麼樣呢?
嗯.. 自己去做實驗吧!
說到這裡那也就是說 int 可以一共有 2 的 32 次方種變化
其中包含了 0、正數、負數
也就是說 int 的正確範圍是 -2147483648 ≦ int ≧ 2147483647
這時候如果看得懂以上文章的朋友,應該也會有人有疑問吧?
那要怎樣,int 才能讓他的第一個 bit 不要拿來半斷正負數?
簡單說,要怎麼做才能直接全部是 0~正數 呢!?
其實標題已經爆雷了!
答案就是加個 unsigned,unsigned 就是指全部為正整數的意思!
也就是說家了 unsigned 的 int,其數字範圍便是 0 ≦ int ≧ (2 的 32 次方 - 1)
若是你有實驗精神,可以用 Dev C++ 印出來便會如此!
不過要注意,printf %d 印不出來,要用 cout 喔,在使用 cout 時,記得要加上:
#include <iostream> using namespace std;
以下就是程式碼:
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std ; int main() { int number1; unsigned int number2; number1 = 2147483647; cout << number1; cout << endl; number1 = number1 + 1; cout << number1; cout << endl; number1 = number1 + 1; cout << number1; cout << endl; cout << endl; number2 = 2147483647; cout << number2; cout << endl; number2 = number2 + 1; cout << number2; cout << endl; number2 = number2 + 1; cout << number2; cout << endl; system("PAUSE"); return 0; }
上例 是使用 number1、number2 做測試,number1 是有正負號的 int,number2 則沒有
執行完,便可得到我剛剛講的結果囉!
BTW,cout << endl; 是只換行的意思!
關於 cout 可以參考此篇 http://it-easy.tw/cout/