C核心技術手冊(二十七)

2022-03-10 18:16:56 字數 2725 閱讀 4682

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...