關於整型提公升(1)

2021-09-14 05:29:01 字數 1750 閱讀 4822

隱式型別轉換

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種中的哪一種呢?答案取決於字面值時如何書寫的。比如在整數字面值...