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

2021-06-16 05:07:15 字數 2050 閱讀 9708

4.1.5.3

有符號整型轉換

整型型別轉換中超過目標型別取值範圍的問題,不僅存在在無符型別轉換中,也存在有符號型別轉換中,例如,當乙個值由型別

long

或unsigned int

轉換為int

,結果為有符號整型並溢位,這與轉換為無符號整數不同,後者將會丟棄執行結果。

絕大多數編譯會丟棄原來值二進位制表示的高位,並將最低位解釋為新型別,如下例所示,在這種策略下,乙個

unsigned int

型別現有的位模式被解釋為乙個有符號

int值。

#include // defines macros such as uint_max

int i = uint_max;// result: i = -1 (in two's complement

// representation)

然而,由於編譯器不同,這樣的乙個轉換有的編譯器會丟擲乙個訊號提示值溢位。當乙個實數和乙個複數轉換為有符號整型時,與轉換為無符號整型具有同樣的規則,這與前面一節描述的一樣。

4.1.5.4

浮點型別實數轉換

不是所有的整型值可以被浮點型表示,例如,雖然

float

型別的取值範圍包含了

long

和long long

的取值範圍,

float

僅精確到小數點後

6位,因而,一起

long

型別的值不能精確地儲存在

float

物件中,這種轉換的結果是下乙個或更高的二進位制值,如下例所示:

longl_var = 123456789l;

float f_var = l_var;// implicitly converts long value to float.

printf("the rounding error (f_var - l_var) is %f/n", f_var - l_var);

記住此例中的減操作,像所有浮點型一樣,結果至少具有

double

型別的精度,此**段輸出如下:

the rounding error (f_var - l_var;) is 3.000000

任意乙個浮點型別可以使用精度比它大的另乙個浮點型別來表示,因此,當乙個

double

值轉換為

long double

,或者當乙個

float

值轉換為

double

或long double

,值會精確地保持。當從乙個高精度轉換為乙個低精度型別時,然而,其值可能會超出新型別的範圍,如果超出,轉換的結果是未定義的;如果其值在目標型別的範圍內,但目標型別的精度不能精確地表示它,此時,結果為下一更小的或下乙個更大的二進位制值,

example 2-2

中的程式描述了轉換為乙個低精度浮點型別時產生的誤差錯誤。

當乙個複數轉換為乙個實數時,虛數部分被簡單地丟棄掉,結果為復資料的實數部分,它之後可能會轉換為本章中描述的目標型別。

4.1.5.5

浮點型複數轉換

當乙個整型或浮點型實數轉換為乙個複數型別時,結果值的實數部分按照前面的規則轉換為浮點型實數,虛數部分為0。

當乙個複數轉換為另乙個不同的複數型別時,實數和虛數數分單獨根據浮點型實數的規則進行轉換。

#include // defines macros such as the imaginary

// constant i

double _complex dz = 2;

float _complex fz = dz + i;

在兩行初始化語句中,整型常量

2隱式地轉換為

double_complex

並賦值給

dz, dz

的結果為

2.0 + 0.0 * i 。在

fz的初始化中,dz的

double_complex

值兩部分都轉換為

float,fz

的實數部分等於

2.0f,

虛數部分為

1.0f

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

4.1.5.3 有符號整型轉換 整型型別轉換中超過目標型別取值範圍的問題,不僅存在在無符型別轉換中,也存在有符號型別轉換中,例如,當乙個值由型別long 或unsigned int 轉換為int 結果為有符號整型並溢位,這與轉換為無符號整數不同,後者將會丟棄執行結果。絕大多數編譯會丟棄原來值二進位制...

C核心技術手冊(二十)

在c 中,常量是表示乙個固定值的記號,它可能是整型 浮點型 字元 或乙個串。乙個常量的型別由它的值和記法來決定。這裡討論的常與混合常量不同,混合常量在c99 標準中介紹,它通常是可修改的物件,類似於變數,了解混合常量的詳細介紹和特殊操作可參見第五章。乙個整型常量可以以普通的十進位制數表示,或者是八進...

C核心技術手冊(三十八)

18.3.1.4 連線聯結器將多個二進位制的 object 檔案連線成為乙個可執行檔案,在程序中,它完成使用外部引用來替換程式中本地物件的引用。聯結器依據彙編器提供的符號表來完成這些工作。此外,聯結器必須為程式中使用的 c標準庫的函式新增 在連線的上下文中,乙個庫就是一系列 object 檔案的集合...