注意:以下內容摘自文獻[1],修改了部分內容。
1.賦值過程中的類型轉換
如果賦值運算符兩側的類型不一致,但都是數值型或字符型時,在賦值時自動進行類型轉換。
(1) 將浮點型數據(包括單、雙精度)賦給整型變量時,舍棄其小數部分。
(2) 將整型數據賦給浮點型變量時,數值不變,但以指數形式存儲到變量中。
(3) 將一個double型數據賦給flout變量時,要注意數值范圍不能溢出。
float f; double d = 123.456789e100; f = d;
就會出現溢出的錯誤,因為超過了float型的數據范圍。
(4) 字符型數據賦給整型變量,將字符的ASCII碼賦給整型變量。
(5) 將一個int, short或long型數據賦給一個char型變量,只將其低8位原封不動地送到char型變量(發生截斷)。例如
short int i = 289; char c; c = i; // 將一個int型數據賦給一個char型變量
i = 289
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
c = 33
0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
為了方便,假設一個int型數據占兩個字節(實際上,在VC++ 6.0中占4個字節),得到的c = 33,只得到i的低8位。
(6) 將signed型數據數據賦給長度相同的unsigned型變量,將存儲單元內容原樣照搬(連原有的符號位也作為數值一起傳送)。
例子:
// 20191009.cpp : 定義控制台應用程序的入口點。 #include "stdafx.h" #include <iostream> #include <typeinfo> using namespace std; int main() { system("color 3f"); unsigned short a; short int b = -1; a = b; cout << "a = " << a << endl; system("pause"); return 0; }
結果:
不妨從變量值在內存中存儲形式分析,數據在內存中都是以二進制形式的補碼存儲的。b = -1,-1的補碼形式為:1111 1111 1111 1111,將它全部傳給a,a是無符號短整型變量,a = 1111 1111 1111 1111 = 65535;如果b為正值,且在0~32767之間,則賦值后數值不變。
參考文獻
[1]譚浩強.C++程序設計[M].北京:清華大學出版社.