電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
[C++][5]變數

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式初級班:語法及基礎概念
上一篇主題 :: 下一篇主題  
發表人 內容
yag
Site Admin


註冊時間: 2007-05-02
文章: 688

2673.35 果凍幣

發表發表於: 2007-5-22, PM 9:31 星期二    文章主題: [C++][5]變數 引言回覆

程式裡所謂的變數,就跟數學中的變數、未知數一樣,以一個符號來代表某一個數字,這個符號就是變數。
像是 X = 3; 中,X就是一個變數,我們將它指定為3
Y = 4 * X + 5; 中,X和Y都是變數,X為我們已知的3,所以Y就會是17

變數在程式設計中佔有非常重要的地位,幾乎所有的程式都會用到變數,因為我們必須有個空間來存放數值並進行運算。在C++中使用變數,我們必須先進行宣告(Declaration)這個動作,經由此一動作,系統會指派一份記憶體空間給我們指定的變數,而這塊記憶體的大小以及數值在其中儲存的方式,則依據我們所宣告的變數型態而有所不同。

來看一個最簡單的例子:
代碼:
int x;
這就是一個叫做x的變數的宣告,int就是它的變數型態,也就是整數型態,像是-2、-1、2、4、7之類的數值,在VC++中使用int宣告一個變數,系統會給予它4 Bytes的大小,在此要介紹一下記憶體的單位。

1個Byte就是8個Bits,而1個Bits,是記憶體的最小單位,它可以儲存一個2進位的數字,也就是0或者1,以電子電路的方式來說,就是開跟關,像是一個燈泡,亮了就代表1,關了就代表0,雖然實作上是以高電位跟低電位來區分0跟1,不過這不屬於我們的討論範圍,有興趣的人可以去找電子電路的書來看。

現在我們知道,1個Byte就是8個可記錄0跟1的單位,那麼它可記錄的數值範圍是多少呢?以直觀來說,最低的數字當然是00000000,也就是代表了0,而最高的數字就是11111111,以二進位來說,這就代表了255(也就是2的8次方減1),關於進位之間的轉換就不多談了,不懂的請盡量先上網查查再發問。

由以上可知,1個Byte可以儲存的整數範圍從0~255,而4個Bytes可以儲存的範圍就是從0~2的32次方減1(2^32 - 1)了,可是這樣一來,不就不能儲存負數了嗎?所以我們會將最前面的那1個Bit當成正負符號來看,最前面是0,代表是正數,最前面是1,代表是負數,因此一個int可以儲存的數值範圍就是從-2^31 ~ 2^31 - 1也就是-2147483648 ~ 2147483647,如果你用int儲存了一個此範圍外的整數,你的程式就會出bug,你寫的遊戲可能就會有洗錢洗裝備的情況出現。

以上應該了解了吧?變數型態會告訴系統兩件事情,第一就是記憶體的大小,第二就是數值儲存的方式
以int為例,記憶體大小就是4 Bytes,而數值儲存方式就是第一個位元當成正負符號,後面的位元以2進位來計數。

在VC++中,有以下各種基本的變數型態:
代碼:
整數型態    記憶體大小    值域
char      1 Bytes     -128 ~ 127
short     2           -32768 ~ 32767
int       4           -2147483648 ~ 2147483647
long      4           同int
浮點數型態
float     4           1.2 * 10^-38 ~ 3.4 * 10^38
double    8           2.2 * 10^-308 ~ 1.8 * 10^308
上面所謂的浮點數,也就是指小數了,像是3.25、2.86之類的,這類的變數,因為數值儲存方式的不同,所以float跟int明明都是4 Bytes的空間,但可儲存的數值範圍卻天差地遠,不過也因為儲存方式的關係,浮點數在精確度上會有些微的問題,比如說,存一個數值3.568746給float型態的變數F,然後拿F跟3.568746來比較,得到的答案有可能是不相等,因為儲存的方式讓float捨棄掉了完全正確的精確度,而取了一個近似值來記錄,如果對浮點數在記憶體中如何儲存有興趣,可以上網查詢,這裡就不細講了。

另外想必會有人有疑問,為什麼int跟long都是4 Bytes,既然都一樣,那何必要有long。這是因為,在比較早期的標準C++中,只規定了分配的記憶體大小必須long >= int >= short,而沒有明確地指示其應該分配多少記憶體,所以這就造成每家compiler會指定不同大小的記憶體,因此,在VC++中long是4 Bytes,但在其他compiler中,long可能是8 Bytes,這是取決於compiler製造者的看法的,不過現在標準C++有沒有指定long為8 Bytes我就不太清楚,即使有,VC++目前也還是以4 Bytes為準,反正它本來就沒有完全遵守C++的標準,前陣子聽人家說,目前只有唯一一個compiler是完全遵守C++標準的,不過他說這個compiler很少人用,他連名字都忘了。

因此,為了避免溢出(Overflow),當你換了一個compiler來寫程式時,就要記得使用sizeof運算子來查詢其每個變數所佔記憶體大小。所謂的overflow,也就是存了一個超出值域的數值造成數值的不正確,像是short只能存-32768 ~ 32767,結果你丟了40000進去,那就會產生overflow囉。

另外,在宣告變數型態的前面,可以加上unsigned修飾詞,來修改其數值儲存方式,使其只能儲存正數,來更改其值域,像是unsigned short,其值域是從0 ~ 65535,也就是原本儲存正負狀態的第一個Bit也拿來做為數值儲存之用。

sizeof運算子的用法非常簡單,它可以回傳其後變數所佔記憶體大小,只要看了以下範例,想必難不倒你,就不再多講了。
代碼:
#include <iostream>

using namespace std;

int main()
{
   char a;
   short b;
   int c;
   long d;
   float e;
   double f;
   
   cout << "char   " << sizeof a << endl;
   cout << "short  " << sizeof b << endl;
   cout << "int    " << sizeof c << endl;
   cout << "long   " << sizeof d << endl;
   cout << "float  " << sizeof e << endl;
   cout << "double " << sizeof f << endl;

   system( "pause" );

   return 0;
}
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
s13579239
偶而上來逛逛的過客


註冊時間: 2007-12-01
文章: 12

0.00 果凍幣

發表發表於: 2007-12-20, PM 10:19 星期四    文章主題: 好難喔,都看不懂ˊˋ 引言回覆

想學可是又看不懂,而且我連怎麼做都不知道ˊˋ
回頂端
檢視會員個人資料 發送私人訊息
fire231
散播福音的祭司


註冊時間: 2007-09-15
文章: 152

322.55 果凍幣

發表發表於: 2007-12-21, PM 9:07 星期五    文章主題: Re: 好難喔,都看不懂ˊˋ 引言回覆

首先需要有國文數學英文基礎的

要明確的知道你想要什麼

要知道英文的名字(雖然這用字典查的到)

再來需要邏輯的判斷

再來有人問是最好

最後多看看文章介紹

要寫程式也要有個可以寫可以編譯的軟體

免費的就DEV-C++

要錢的就是微軟的VC++(大家基本上都是用這個)
回頂端
檢視會員個人資料 發送私人訊息
happylin
略有貢獻的成員


註冊時間: 2007-07-26
文章: 70

127.34 果凍幣

發表發表於: 2007-12-24, PM 1:54 星期一    文章主題: 引言回覆

引言回覆:

最前面是0,代表是正數,最前面是1,代表是負數


並不能單單只是說最前面的bit(MSB) 是1就是正數還是負數
基本上這要牽扯到你用的系統的數字表示法. 一般目前的x86 cpu (大多數的cpu 也是)
整數的數字系統都是用2 的補數表示法.
在這個系統下. 負數表示剛好MSB 會是1 . 但是剩下得bit 並不是剛好為正數的相同值
以32bit 的2的補數. -1 在memory 中是 32個1 . 把最高的bit(MSB) 不要看. 會是最大的正數.
回頂端
檢視會員個人資料 發送私人訊息
yag
Site Admin


註冊時間: 2007-05-02
文章: 688

2673.35 果凍幣

發表發表於: 2007-12-24, PM 4:31 星期一    文章主題: 引言回覆

happylin 寫到:
引言回覆:

最前面是0,代表是正數,最前面是1,代表是負數


並不能單單只是說最前面的bit(MSB) 是1就是正數還是負數
基本上這要牽扯到你用的系統的數字表示法. 一般目前的x86 cpu (大多數的cpu 也是)
整數的數字系統都是用2 的補數表示法.
在這個系統下. 負數表示剛好MSB 會是1 . 但是剩下得bit 並不是剛好為正數的相同值
以32bit 的2的補數. -1 在memory 中是 32個1 . 把最高的bit(MSB) 不要看. 會是最大的正數.

隨時歡迎您寫一篇再詳細深入些介紹系統數字表示法以及1's complement、2's complement等用處的文章。 Very Happy
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件

稍嫌羞澀的路人


註冊時間: 2011-04-02
文章: 4

25.27 果凍幣

發表發表於: 2011-4-2, AM 3:21 星期六    文章主題: Re: [C++][5]變數 引言回覆

非常詳細
看得懂^.^
只是英文有點苦手
用了一下字典ˊˋ
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式初級班:語法及基礎概念 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作