K R C vs ANSI C(資料型別提公升)

2022-09-16 19:30:26 字數 1594 閱讀 3026

前面我們提到,當操作符的運算元型別不一致時,會發生型別轉換,它負責把兩個不同的運算元型別轉換成

同一種普通操作型別,轉換後的型別,一般也就是結果型別。

拋磚:

printf (「%d」, sizeof 『a』);

這行**列印出儲存乙個字元字面值型別的長度。你敢確定它的結果是 1 嗎?執行一下試試。你會發現它的

結果是 4 (或者是你機器上int的長度)。字元常量的型別是int,根據提公升規則,它由 char 轉換為 int 。這個

概念在 k&r 中是這樣描述的:

在表示式中,每個 char 都被轉換為 int ···注意所有位於位於表示式中的 float 都被轉換為 double ···由於

函式引數也是乙個表示式,所以當引數傳遞給函式時也會發生型別轉換。具體地說, char 和 short 轉換為 int

,而 float 轉換為 double。

——the c programming language, 第一版, p39

這個特性被稱為型別提公升。當它發生於整型型別時稱為「整型提公升」。ansi c 延續了自動型別提公升的概念,

儘管在許多地方它已褪色。關於型別提公升,ansi c 有如下說明:

在執行下列**段時

char c1,c2;

c1 = c1 + c2;

「整型提公升」規則要求抽象機器把每個變數的值提公升為 int 的長度,然後對兩個 int 值執行加法運算,然後再

對運算結果進行裁剪。如果兩個 char 的加法運算結果不會發生溢位異常,那麼在實際執行時只需要產生 char

型別的元算結果,可以省略型別提公升。

類似,在下列**段中

float f1,f2;

double d;

f1 = f2 * d;

如果編譯器可以確定用 float 進行運算的結果跟轉換為 double 後進行運算(例如,d 由型別為 double

的常量 2.0 所代替)的結果一樣,那麼也可以使用 float 來進行乘法運算。

——ansi c 標準,第5.1.2.3節

c語言中的型別提公升

源型別通常提公升後的型別

char

int位段(bit - field)

int列舉(enum)

intunsigned char

intshort

intunsigned short

intfloat

double

任何陣列

相應型別的指標

整型提公升就是 char、short int 和位段型別(無論 signed 或 unsigned)以及列舉型別將被提公升

為 int ,前提是 int 能夠完整的容納原先的資料,否則將被轉換為 unsigned int 。ansi c 表示如果

編譯器能夠保證運算結果一致,也可以省略型別提公升——這通常出現在表示式中存在常量運算元的時候。

K R C vs ANSI C(資料型別轉換)

k r c 採用無符號保留 unsigned preserving 原則,就是當乙個無符號型別與int或更小的整型混合使用時,結果型別是無符號型別。這是個簡單的規則,與硬體無關。但是,真如下面的例子所展示的那樣,它有時會使乙個負數丟失符號位。ansi c 採用值保留 原則,就是當把幾個整型運算元像下...

資料型別基礎資料型別

資料型別 基礎型別 除八大基礎型別其他的都是引用型資料型別 引用資料型別 基礎資料型別 整型 byte 佔乙個位元組,範圍 128 127 short 佔兩個位元組,範圍 32768 32767 int 最常用 佔四個位元組,範圍 2147483648 2147483647 long 佔八個位元組 ...

資料型別 基本資料型別和引用資料型別

一.分類 1,五種簡單資料型別 基本資料型別 number,string,boolean,null,undefined,新增symbol es6 基本資料型別是指存放在棧中的簡單資料段,資料大小確定,記憶體空間大小可以分配,它們是直接按值存放的,所以可以直接按值訪問。1 undefined 宣告的變...