知識文章型態 unsigned int

型態 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/ 

張貼者:吳政賢發佈。
瀏覽人數:689 人