4.1.5
算術型別轉換結果
由於不同的型別有不同的目的、特性和侷限性,將乙個型別轉換為另一型別通常要處理這些差異,通常,乙個型別轉換後的值取決於目標型別的特性。
4.1.5.1 _bool
型別轉換
任何標量型別可被轉換為
_bool,
結果為0i.e.
當標量值為
o時,使用
false;
當標量值為
1時或非
0時,使用
true;
因為乙個
null
指標比喻為
0,所以轉換為
_bool
後,其值為
false.
4.1.5.2
無符號整型轉換
當整型值在新的無符號型別範圍內時,它的值會被保護,換句話說,如果它們在0和
utype_max
之前,utype_max
為無符號型別的最大取值。
在無符號型別取值範圍之外的值,它們的值將會多次加上或減去
utype_max + 1
,直到其值在新型別的取值範圍之內,下面的例子描述了把乙個負數賦值給無符號整型:
#include // defines the macros ushrt_max, uint_max, etc.
unsigned shortn = 1000; // the value 1000 is within the range of unsigned
// short;
n = -1;// the value -1 must be converted.
將有符號數
-1賦值給乙個無符號型別的變數,程式隱式地加上了
ushrt_max + 1
直到其結果在新型別的取值範圍內,因為
-1 +
(ushrt_max + 1
)= ushrt_max,
上例中,
n的最終結果為
ushrt_max;
對正整數而言,會減去(
utype_max + 1
)使其值在新型別的取值範圍之內,這與除以
(utype_max + 1)
效果相同,如下例所描述:
#include // defines the macros ushrt_max, uint_max, etc.
unsigned shortn = 0;
n = 0xfedcba;// the value is beyond the range of unsigned
// short.
如果unsigned short為16
位的寬度,那麼它的最大值為
ushrt_max
,其十六進製制為
ffff
,當值fedcba
被轉換為
unsigned short
時,如果與它除以十六進製制
10000(
即ushrt_max + 1)
的餘數相等,通常小於或等於
ffff
,在此例中,
n的值最終被賦於
dcba
。將乙個浮點型實數轉換為無符號或有符號整數型別,編譯器將丟棄分數部分,如果整數部分的值在新型別的取值範圍外,結果將會轉換為無符號型別,例如:
double x = 2.9;
unsigned long n = x;// the fractional part of x is simply lost.
unsigned long m = round(x);// if x is non-negative, this has the
// same effect as m = x + 0.5;
本例中初始化變數n時,
x的值由
double
轉換為unsigned long,
並丟棄分數部分
0.9.
整數部分的
2將被賦值給
n, 在初始化
m時,使用
c99標準中的
round()
函式,計算與
x最接近的整型值,並返回乙個
double
型別的值,小數部分的
0.3在賦值給
unsigned long
型別的m
時會被丟棄。
當乙個複數轉換為無符整數型別時,虛數部分首先會被丟棄,轉換後的結果值為浮點型,例如
:#include // defines macros such as uint_max.
#include // defines macros such as the imaginary
// constant i.
unsigned intn = 0;
float _complexz = -1.7 + 2.0 * i;
n = z;// in this case, the effect is the same as
// n = -1;
// the resulting value of n is uint_max.變數z
的虛數部分被丟棄,留下實數部分的浮點值
-1.7,
然後浮點型的小數部分也被丟棄,留下的整型值為
-1,它通過加上
uint_maxt + 1
轉換為unsigned int
型別,因此,最後
n被賦值為
uint_max
。
C核心技術手冊(二十七)
4.1.5 算術型別轉換結果 由於不同的型別有不同的目的 特性和侷限性,將乙個型別轉換為另一型別通常要處理這些差異,通常,乙個型別轉換後的值取決於目標型別的特性。4.1.5.1 bool 型別轉換 任何標量型別可被轉換為 bool,結果為0i.e.當標量值為 o時,使用 false 當標量值為 1時...
C核心技術手冊(十七)
c99 支援數 算中的複數。1999 年標準介紹了複數浮點型別及提供複數函式的擴充套件數學庫,這些函式宣告在 complex.h 中,包含例如三角函式 csin ctan 等等。乙個複數 z可以在笛卡兒座標系中使用 z x y i 表示,其中x和 y為實數,i是乙個虛構的單位,以以下等式定義 i2 ...
C核心技術手冊(十七)
c99 支援數 算中的複數。1999 年標準介紹了複數浮點型別及提供複數函式的擴充套件數學庫,這些函式宣告在complex.h 中,包含例如三角函式csin ctan 等等。乙個複數z 可以在笛卡兒座標系中使用z x y i 表示,其中x 和y為實數,i 是乙個虛構的單位,以以下等式定義 i 2 1...