iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
Software Development

三十天內用C++寫出一個小遊戲系列 第 8

Day 8 - 變數又來了? 變數怎麼叫 a

變數怎麼叫

今天起兩天,會介紹一下在C++裡面,每一個變數的叫法規則,他們在電腦裡面是怎麼樣儲存的。

經過了兩天的訓練,應該二進位不陌生吧!這些變數就是用二進位等等的方式儲存的,但每個變數又不太一樣啦,下面就來一一介紹。


資料型態

在介紹變數的型態之前,我們可以先了解一下在C++中的基本資料型態(Basic data types)。

首先

第一種是: literal 它是一種被寫死的質 (例如之後會稍微講一下的 constant (常數) )

第二種是: variable 就是一個可以變動的質 (像是下面會提到的變數)


變數有哪些?

之前有稍微提到過,變數到底有那些東西,那我們一樣搬來那個表格:

【C++中有那些變數呢?- 整數部分】

Name bytes
bool 1
char 1
int 4
short 2
long 4
unsigned int 4
unsigned short 2
unsigned long 4

我在第四天的時候有說過,宣告變數,就像是要跟一間餐廳訂位一樣,你需要先跟餐廳說你要預訂多少位置,餐廳才可以預留多少位置給你。

宣告這些變數的時候,就是在宣告這些位置,而後面那個bytes 就指的是你宣告的變數需要多少個位置。

一個 byte 會等於 八個bit

所以,拿 int 來舉例,他佔有 4 個bytes,也就是說他的bit會來到 32 bit 這麼多!

那一個bit 又是甚麼呢?

還記得上次我們談到的2進位嗎,它的其中一個數字就是一個 bit 啦!

例如: 0010 0010 其中每一個0還有1就是一個 bit!

那我們來詳細一點的介紹一下這些整數的變數吧!


int

為integer, 整數的縮寫

佔據 4 個 bytes = 32 bits

因為佔據了共 32 個 bits,所以它可以儲存的資料大小可以從 (-2^31) ~ (+2^31) - 1

可以想像成像上圖一樣的圖形。

在這邊就可以順便介紹其他的整數:

  1. unsigned int :

    它也占據了 4 個 bytes,但是它儲存的資料只有從0 ~ (2^32) - 1(也就是只有正數)

  2. short :

    它佔據了 2 個 bytes,所以它儲存的資料只有 int 的一半(-2^15 ~ + 2^15 - 1) (總共只有 16 bits)

  3. long :

    它跟 int 佔據了一模一樣的空間,(在32位元的編譯器中),因此可以儲存的範圍跟 int 一樣


sizeof()

在你很懷疑一個變數是多大的時候,你可以使用這個函式來確認它真正的大小。

要怎麼用?

#include<iostream>
using namespace std;

int main(){
	cout << "int" << sizeof(int) << endl;
	cout << "unsigned int" << sizeof(unsigned int) << endl;
	cout << "short" << sizeof(short) << endl;
	cout << "long" << sizeof(long) << endl;
	
	return 0;
}

就會得到:

所以如果有疑惑就去做看看吧!


climits

這邊這個函式庫,則可以查到一個變數的上下界

例如:

#include<iostream>
#include<climits>
using namespace std;

int main(){
	cout << INT_MIN << ", " << INT_MAX << endl;
	cout << endl;
	cout << SHRT_MIN << ", " << SHRT_MAX << endl; //SHRT 是 short的簡稱
	cout << endl;
	cout << LONG_MIN << ", " << LONG_MAX << endl;
	
	return 0;
}

可以得到 :


Overflow 溢位

這個詞好像常被人提起,但是好像又不太知道甚麼意思吧!

我們直接丟個例子:

#include<iostream>
using namespace std;

int main(){
	short numberA = 32765; // 32765 = 2^15 - 3;
	int i = 0;
	while (i < 10)
	{
		short numberB = numberA + i;
		cout << numberA + i << " " << numberB << endl;
		i++;  
	}
}

這時候,你會發現怎麼兩邊的數字怪怪的,明明numberA 跟 numberB 好像是長的一模一樣的東西,但是印出來的東西又是另外一個回事。

我們可以先關注是從哪裡開始改變的:

numberB 從 32767 + 1 後,變成了- 32768

疑,阿怎麼越加越小咧?

其實是因為這樣:

在整數中,最前面那個bit 是專門在處理正負號的,而short又只有 16 個 bits,所以當每個bit都塞滿的時候,再加 1 就會滿出來,變成負號了!


小結

進位還有電腦裡面運作真的有點複雜,但都是必須要搞懂的小東西。

ps 媽媽真的不懂梗圖 & memes 在幹嘛。


參考

1.https://read01.com/zh-tw/JDNzj6.html

2.(limits.h)


上一篇
Day 7 - 數學是不是會擊垮一個人的信心? 會
下一篇
Day 9 - 變數又來了? 變數怎麼叫? b
系列文
三十天內用C++寫出一個小遊戲30

尚未有邦友留言

立即登入留言