一、宏定義 #define 和常量 const
1、
const關鍵字
const是constant的簡寫,只要一個變量前面用const來修飾,就意味着該變量里的數據可以被訪問,不能被修改。也就是說const意味着只讀(readonly)。
const修飾一個變量,一定要給這個變量初始化值,若不初始化,后面就無法初始化。
1.1
#include <iostream> using namespace std; int main() { const double pi; //圓周率的值用pi表示 pi=3.14159265; cout<<"圓周率的近似值是"<<pi<<endl; return 0; }
報錯,沒有初始化。只讀。
1.2
#include <iostream> using namespace std; int main() { const double pi=3.141592; //圓周率的值用pi表示 cout<<"圓周率的近似值是"<<pi<<endl; return 0; }
1.3
const關鍵字應用
- 欲阻止一個變量被改變,可使用const,在定義該const變量時,需先初始化,以后就沒有機會改變他了;
- 對指針而言,可以指定指針本身為const,也可以指定指針所指的數據為const,或二者同時指定為const;
- 在一個函數聲明中,const可以修飾形參表明他是一個輸入參數,在函數內部不可以改變其值;
- 對於類的成員函數,有時候必須指定其為const類型,表明其是一個常函數,不能修改類的成員變量;
- 對於類的成員函數,有時候必須指定其返回值為const類型,以使得其返回值不為“左值”
2、
宏定義 #define 和常量 const 的區別
類型和安全檢查不同
宏定義是字符替換,沒有數據類型的區別,同時這種替換沒有類型安全檢查,可能產生邊際效應等錯誤;
const常量是常量的聲明,有類型區別,需要在編譯階段進行類型檢查
編譯器處理不同
宏定義是一個"編譯時"概念,在預處理階段展開,不能對宏定義進行調試,生命周期結束於編譯時期;
const常量是一個"運行時"概念,在程序運行使用,類似於一個只讀行數據
存儲方式不同
宏定義是直接替換,不會分配內存,存儲與程序的代碼段中;
const常量需要進行內存分配,存儲與程序的數據段中
2.1
2.2
2.3
二、有符號數和無符號數
1、基本概念
在計算機中,可以區分正負的類型,稱為有符類型(signed);無正負的類型(只有正值),稱為無符號類型 (unsigned)。數值類型分為整型或實型,其中整型又分為無符類型或有符類型,而實型則只有有符號類型。 字符類型也分為有符和無符類型。 比如有兩個量,年齡和庫存,我們可以定前者為無符的字符類型,后者定為有符的整數類型。
1.1 原碼
可以看到 +5 和 -5 的原碼除了最高位不一樣外,其他都一樣。正數最高位為0,負數最高位為1。
1.2 反碼
反碼: 正數的反碼為原碼,負數的反碼是原碼符號位外按位取反。
可以知道: +5的反碼是:00000000 00000000 00000000 00000101
-5的反碼是:11111111 11111111 11111111 11111010
1.3 補碼
正數補碼等於原碼,也就是正數原碼、反碼、補碼都一樣。
負數:反碼加1稱為補碼。
2、例子
2.1
#include <iostream> using namespace std; /* * 這個程序演示了有符號整數和無符號整數之間的差別 */ int main() { short int i; // 有符號短整數 short unsigned int j; // 無符號短整數 j = 50000; i = j; cout<<"無符號數:" <<j<<endl; cout << "有符號數:"<<i ; return 0; }
2.2
上面 j 是無符號數,所以就是顯示的 50000。
接下來我們算下-15536是怎么來的。
(1)
50000 在電腦中存的就是上面的二進制數: 1100 0011 0101 0000 。並且是以補碼的形式存的。
當表示無符號數時,補碼和原碼時一樣的,所以原碼依舊是:1100 0011 0101 0000。對應的數就是 50000,就是程序中展示的 50000。
(2)
當表示有符號數時,補碼的最高位1 表示是負數,然后我們通過補碼—>反碼—>原碼,來計算i的值。
1100 0011 0101 0000 -1=1100 0011 0100 1111 反碼(最高位不變,其他位借位減)
1011 1100 1011 0000 原碼(最高位代表負數)
經過如下的變化,就得出了 -15536 的值。