c++ 常量/有符號數和無符號數

1、宏定義 #define 和常量 const ios

一、安全

const關鍵字函數

constconstant的簡寫,只要一個變量前面用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,也能夠指定指針所指的數據爲const,或兩者同時指定爲const;
  • 在一個函數聲明中,const能夠修飾形參代表他是一個輸入參數,在函數內部不能夠改變其值;
  • 對於類的成員函數,有時候必須指定其爲const類型,代表其是一個常函數,不能修改類的成員變量;
  • 對於類的成員函數,有時候必須指定其返回值爲const類型,以使得其返回值不爲「左值」

二、

宏定義 #define 和常量 const 的區別

類型和安全檢查不一樣

宏定義是字符替換,沒有數據類型的區別,同時這種替換沒有類型安全檢查,可能產生邊際效應等錯誤;

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 的值。

相關文章
相關標籤/搜索