1、宏定義 #define 和常量 const ios
一、安全
const關鍵字函數
const是constant的簡寫,只要一個變量前面用const來修飾,就意味着該變量裏的數據能夠被訪問,不能被修改。也就是說const意味着只讀(readonly)。spa
const修飾一個變量,必定要給這個變量初始化值,若不初始化,後面就沒法初始化。指針
1.1調試
#include <iostream> using namespace std; int main() { const double pi; //圓周率的值用pi表示 pi=3.14159265; cout<<"圓周率的近似值是"<<pi<<endl; return 0; }
報錯,沒有初始化。只讀。blog
1.2生命週期
#include <iostream> using namespace std; int main() { const double pi=3.141592; //圓周率的值用pi表示 cout<<"圓周率的近似值是"<<pi<<endl; return 0; }
1.3內存
const關鍵字應用ci
二、
類型和安全檢查不一樣
宏定義是字符替換,沒有數據類型的區別,同時這種替換沒有類型安全檢查,可能產生邊際效應等錯誤;
const常量是常量的聲明,有類型區別,須要在編譯階段進行類型檢查
編譯器處理不一樣
宏定義是一個"編譯時"概念,在預處理階段展開,不能對宏定義進行調試,生命週期結束於編譯時期;
const常量是一個"運行時"概念,在程序運行使用,相似於一個只讀行數據
存儲方式不一樣
宏定義是直接替換,不會分配內存,存儲與程序的代碼段中;
const常量須要進行內存分配,存儲與程序的數據段中
2.1
2.2
2.3
2、有符號數和無符號數
一、基本概念
在計算機中,能夠區分正負的類型,稱爲有符類型(signed);無正負的類型(只有正值),稱爲無符號類型 (unsigned)。數值類型分爲整型或實型,其中整型又分爲無符類型或有符類型,而實型則只有有符號類型。 字符類型也分爲有符和無符類型。 好比有兩個量,年齡和庫存,咱們能夠定前者爲無符的字符類型,後者定爲有符的整數類型。
1.1 原碼
能夠看到 +5 和 -5 的原碼除了最高位不同外,其餘都同樣。正數最高位爲0,負數最高位爲1。
1.2 反碼
反碼: 正數的反碼爲原碼,負數的反碼是原碼符號位外按位取反。
能夠知道: +5的反碼是:00000000 00000000 00000000 00000101
-5的反碼是:11111111 11111111 11111111 11111010
1.3 補碼
正數補碼等於原碼,也就是正數原碼、反碼、補碼都同樣。
負數:反碼加1稱爲補碼。
二、例子
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 的值。