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


一、宏定義 #define 和常量 const 

1、

const關鍵字

constconstant的簡寫,只要一個變量前面用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 的值。

 

 

 

 

 

 

 

 

 

 

 

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM