標籤:
c++學習筆記:變數(2)
先說明一下上一篇博文中的一個問題:char、signed char、unsigned char 這三者到底是怎麼回事。
signed char與unsigned char 是明確的擁有含義的,也就是說當定義了一個signed char那麼這個char一定是有符號的整數類型。而當定義了一個unsigned char時這個char是明確無符號的整數類型。但是char卻不一定了,它的行為依靠具體的實現。(“普通char究竟是有符號還是無符號,此事由實現確定。這也可能導致出現討厭的,令人詫異的和依賴實現的情況”----斯特勞斯特盧普《c++程式設計語言》)。signed char與unsigned char更加精確但是適用的範圍可能較少。
一、類型轉換。
類型轉換是一種絕大多數類型都支援的運算,它的功能就是把一個類型的對象轉換為另一個類型的對象。自動的類型轉換經常發生,但是名字與它相近的“強制類型轉換”就不那麼受歡迎了(設計不良的標誌)。
常見內建基本類型的類型轉換:1、bool類型轉換為非bool類型,false轉換為0而true轉換為1。但是當轉換方向反過來時,非零值轉換為true而零值轉換為false。
2、浮點數轉換為整數時會去掉小數部分,保留整數部分。
3、把整數賦給浮點數,在整數部分後面補0。
4、當賦給帶符號數的之超出範圍,行為未定義。
無符號與帶符號之間的關係:
從下面的例子看出,int先轉換成了unsigned int了,假設一個值為負數的int轉換為unsigned int時,就要取補碼來解決。
#include<iostream>using namespace std;int main(){ unsigned u=10; int i=-42; cout<<i+i<<endl;//-84 cout<<u+i<<endl;//32位下 4294。。。。。 return 0;}
一個int如何求補碼?比如int -1轉換成unsigned int?首先把-1區絕對值(1)。把1按32位二進位展開 00000000 00000000 00000000 00000001
按位求反 11111111 11111111 11111111 11111110 而後把這個值加1。。。。。。果然大的離譜啊。
unsigned int 與int之間的微妙關係有時顯得極重要
一下代碼描述了一個死循,當i=0時在減一。由於i是一個不帶正負號的整數,i被轉換成一個極大的整數,根本停不下來。
#include<iostream>using namespace std;int main(){ for(unsigned i=10;i>=0;--i) { /*.......*/ }}
二、字面值(文字值)常量
何謂字面值(文字值)?如果一個值“一望便知”,那它就是一個字面值常量。
整數與浮點數字面值:20(十進位)、o24(八進位)、0x24(十六進位)
3.14、3.14E0、0.、0e0、.001都是合法的常量。
字元與字串字面值常量:‘a’這就是字元字面值常量。而“asdfg”就是字串字面值常量,字串字面值常量的更多內容之後會介紹。
逸出序列:查看ASCII碼錶,會發現有一些不可列印的字元比如“退格”他們沒有可視圖符。而另一類就是“逸出序列”。逸出序列有\n(換行)、\t(水平定位字元)等等。它們均以“\”開頭,兩個被當成一個字元。具體的意義可以查閱ASCII碼錶。需要注意的是"\"後面還可以接以x開頭的十六進位數字或最多三個的八位元字。\n為分行符號\12同樣是分行符號。
bool字面值:true與false就是它的字面值。
指標字面值(稍後會說)。
注意:關於求補碼的問題可以查閱相關資料,資料會講解不同數制的補碼求法。
c++學習筆記:變數