型別所能表示的值的範圍決定了轉換的過程:boolb =
42;// _b is true_
inti =
b;// _i has value 1_
i
=3.14
;// _i has value 3_
double
pi =i;
// _pi has value 3.0_
unsigned
charc =
-1;// _assuming 8-bit chars_, _c has value 255_
signed
char
c2 =
256;
// _assuming 8-bit chars_, _the value of c2 is__undefined_
表示式中的有符號和無符號字元(針對字元)以及短整型一律被轉換為整型, 如果int型別能表示原來型別的值,則轉換成int型別;否則轉換成unsigned型別。
當乙個運算量為long型別, 另乙個為unsigned型別時,如果long能表示unsigned的全部值, 則將unsigned轉換成long; 否則將兩個運算量都轉換為unsigned long。
當兩個運算量中值域較寬的型別是float型別時, 不再將float和另一運算量轉換成double型別
這裡需要注意有符號數與無符號數之間運算問題
當表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號型別。因此,從這個意義上講,無符號數的運算優先順序要高於有符號數。
下面的實驗來自網友,本人在vs2013平台進行了驗證:
首先進行乙個實驗,分別定義乙個signed int型資料和unsigned int型資料,然後進行大小比較:
unsigned int a=20;
signed int b=-130;
a>b?還是b>a?實驗證明b>a,也就是說-130>20,為什麼會出現這樣的結果呢?
這是因為在c語言操作中,如果遇到無符號數與有符號數之間的操作,編譯器會自動轉化為無符號數來進行處理,因此a=20,b=4294967166,這樣比較下去當然b>a了。
再舉乙個例子:
unsigned int a=20;
signed int b=-130;
std::cout《這樣乙個題,據說是微軟面試題:
unsigned int i=3;
cout<-1;
問結果是多少。
第一反應:-3。不過結果似乎不是這樣的,寫了個程式,執行了一下,發現是:4294967293。
在32位機上,int型和unsigned int型都是32位的(4個位元組),在表示式i-1中,i是unsigned int型,-1是int型(常量整數的型別同enum),按第5條可以知道-1必須轉換為unsigned int型,即0xffffffff,十進位制的4294967295,然後再與i相乘,即4294967295*3,如果不考慮溢位的話,結果是12884901885,十六進製制0x2fffffffd,由於unsigned int只能表示32位,忽略高四位,因此結果是0xfffffffd,即4294967293。
再比如《c++primer中文版·第五版》中有個說明:
當從無符號數中減去乙個值時,不管這個值是不是無符號數,我們必須確保結果不能是乙個負值。書中給出的例子是:unsigned結果是:232u1 =42,
u2 =
10;
std
::cout
<<
u1 -
u2 <<
std::
endl
;//正確,輸出32
std
::cout
<<
u2 -
u1 <<
std::
endl
;//正確;不過,結果是取模後的值
−32=4294967264
來自為知筆記(wiz)
C Primer快速瀏覽筆記 復合型別
c primer2.3節介紹了兩種復合型別 引用和指標 1.引用1.初始化常量引用時允許用字面值或任意表示式作為初始值,只要該表示式的結果能通過型別轉換成引用的型別即可。2.可以將基類的引用繫結到派生類物件上。舉幾個例子 int refval4 10 錯誤 引用型別的初始值必須是乙個物件 doubl...
C Primer 筆記 列舉型別
1.和類一樣,每個列舉型別定義了一種新的型別。列舉屬於字面值常量型別。2.c 包含兩種列舉 限定作用域的和不限定作用域的。c 11新標準引入了限定作用域的列舉型別。enum class struct myenum 限定作用域的列舉 enum class struct myenum1 限定作用域的列舉...
C Primer學習筆記一 快速入門
c primer 第一章快速入門主要是介紹c 的基本元素,內容很簡單,在此注意兩個問題 1 標準c 的使用 2 未知數目的資料讀入問題 很多情況下。我們不知道要對多少個數求和,而是要一直讀數直到程式輸入結束。輸入結束時,程式將總和寫到標準輸出 include int main 如果我們給出本程式的輸...