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 檔案的集合...