隱式型別轉換
c的整型算術運算總是至少以預設整型型別的精度來進行的。
為了獲得這個精度,表示式中的字元和短整型運算元在使用之前被轉換為普通整型,這種轉換稱為整型提公升。
整型提公升的意義:
表示式的整型運算要在cpu的相應運算器件內執行,cpu內整型運算器(alu)的運算元的位元組長度一般就是int 的位元組長度,同時也是cpu的通用暫存器的長度。 因此,即使兩個char型別的相加,在cpu執行時實際上也要先轉換為cpu內整型運算元的標準長度。 通用cpu(general-purpose cpu)是難以直接實現兩個8位元位元組直接相加運算(雖然機器指令中可能有這 種位元組相加指令)。所以,表示式中各種長度可能小於int長度的整型值,都必須先轉換為int或unsigned int,然後才能送入cpu去執行運算
註明:以上整形提公升的概念與意義均摘抄於網路,並非本人原創
1.負數的整形提公升: char c1 = -1; 變數c1的二進位制位(補碼)中只有8個位元位: 1111111 因為 char 為有符號的 char 所以整形提公升的時候,高位補充符號位,即為1 提公升之後的結果是: 11111111111111111111111111111111
2.正數的整形提公升 :char c2 = 1; 變數c2的二進位制位(補碼)中只有8個位元位: 00000001 因為 char 為有符號的 char 所以整形提公升的時候,高位補充符號位,即為0 提公升之後的結果是: 00000000000000000000000000000001
3.無符號整形提公升,高位補0
例子(1):
char a=3; char b=127; char c =a+b;應該輸出多少呢?
3的補碼:00000000 00000000 00000000 00000011
取低八位:00000011
127的補碼:00000000 00000000 00000000 01111111
取低八位:011111111
c=a+b;(相加時要提公升成整形)
將3整形提公升後:00000000 00000000 00000000 00000011(高位補充符號位,為0)
將127整形提公升後:00000000 00000000 00000000 01111111(高位補充符號位,為0)
相加後:00000000 00000000 00000000 10000010
取低八位:10000010
將c整形提公升:11111111 11111111 11111111 10000010(高位補充符號位,為1)
c的原碼:10000000 00000000 00000000 01111110
列印出結果為(-126)
例子(2):
#define _crt_secure_no_warnings 1
#include
#include
intmain()
a,b要進行整形提公升,但是c不需要整形提公升 a,b整形提公升之後,變成了負數,所以表示式 a0xb6 , b0xb600 的結果是假,但是c不發生整形提公升,則表示式 c==0xb6000000 的結果是真.所以程式輸出的結果是: c
例子(3):
#define _crt_secure_no_warnings 1
#include
#include
intmain()
C語言整型提公升
直接上題 signed char a 0xe0 unsigned int b a unsigned char c a 下面說法正確的是 a.a 0 b 0 為真 b.c a 為真 c.b的16進製為0xffffffe0 d.都不對 說實話這題目第一眼我就沒看懂啥意思,後來看了大佬的分析,發現裡面的門...
C語言整型提公升
整型提公升 c的整型算術運算總是至少以預設整型型別的精度來進行的 為了獲得這個精度,表示式中的字元和短整型運算元在使用之前被轉換為普通整型 表示式的整型運算要在cpu的相應運算器件內執行,cpu內整型運算器alu的運算元位元組長度一般就是int位元組長度,同時也是cpu的通用暫存器的長度 因此,即使...
算術轉化和整型提公升的奧秘
首先請大家先思考一下3個問題,問題相互之間是有關聯的。1,整型字面值是屬於整型家族9種中的哪一種呢?2,什麼是算術轉換?如何轉換的?3,什麼是整型提公升?如何提公升的?為什麼會有整形提公升?下面解答上述問題。1,整型字面值是屬於整型家族9種中的哪一種呢?答案取決於字面值時如何書寫的。比如在整數字面值...