日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言整形提升舉例詳解_C 語言

作者:Jambo! ? 更新時間: 2023-02-23 編程語言

1.什么是整形提升

表達式中的字符和短整形操作數在使用之前被轉換成普通整形int,這種轉換叫做整形提升

整形提升針對的類型小于整形的char,short

char占用1字節空間,short占用2字節空間,在運算時都會提升為占用4個字節的int類型

所以C的整型算術運算總是至少以缺省整型類型的精度來進行的。換而言之整形算術運算都至少以int類型計算的

2.為什么會有整形提升

表達式的整形運算要在CPU的相應運算器內執行,CPU內整型運算器(ALU)的操作數的字節長度一般就是int的字節長度,同時也是CPU的通用寄存器的長度。

通用CPU(general-purpose CPU)是難以直接實現兩個8比特字節直接相加運算(雖然機器指令中可能有這種字節相加指令)。所以,表達式中各種長度可能小于int長度的整型值,都必須先轉換為int或unsigned int,然后才能送入CPU去執行運算。

因此,即使兩個char類型的變量相加,在·CPU執行時實際上也要先轉化為CPU內整型操作數的標準長速度。

3.如何進行整形提升呢?

整形提升是按照變量的數據類型的符號位來提升的

負數的整形提升:

char c1 = -1char類型占1字節,也就是它的二進制補碼只有8個比特位 :1111111
因為char是有符號位的char,所以整形提升的時候,高位補符號位1
提升之后的效果為:11111111111111111111111111111111

正數的整形提升:

char c2 = 1;
變量c2的二進制位(補碼)中只有8個比特位:
00000001
因為 char 為有符號的 char
所以整形提升的時候,高位補充符號位,即為0
提升之后的結果是:
00000000000000000000000000000001

無符號的整形提升:高位補0

4.整形提升的例子

例1

#include<stdio.h>
int main()
{
	char a = 3;
	char b = 127;
	char c = a + b;
	printf("%d\n", c);
	return 0;
}

char a = 3,首先把3放到a中,3是int類型,3的二進制序列為:00000000000000000000000000000011
需要把3放到char中,int是32個比特位,char是8個比特位,所以接下來需要進行截斷:將低8個比特位放到char中,所以此時a中為: 00000011

char b = 127也是一樣
12700000000000000000000000001111111
截斷為011111111

char c = a + b,接下來要進行整型提升
當前char為有符號的char,所以對于a就高位補0,為:00000000000000000000000000000011
同理,b整形提升后為:00000000000000000000000001111111

接下來相加為00000000000000000000000010000010,將這個32位二進制放到c中,截斷為10000010

printf("%d\n", c)中,%d是打印十進制的數,所以還需整形提升,此時c10000010,符號位為:1,整形提升高位補1,最終為11111111111111111111111110000010(補碼),其原碼為10000000000000000000000001111110 ,所以這個數字輸出為-126

輸出結果:

例2

int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
	printf("a");
if(b==0xb600)
	printf("b");
if(c==0xb6000000)
	printf("c");
return 0;
}

比較也是表達式,a,b也要發生整形提升,所以只有c不會整形提升,所以輸為c

輸出結果

這個例子能體現整形提升的存在

例3

int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}

cchar類型,sizeof(c)值為1
+c.-c中,c都參與計算,所以整形提升為int類型,sizeof(+c),sizeof(-c)值都為4

輸出結果:

請添加圖片描述

這個例子也能體現整形提升的存在

例4

下面程序輸出什么?

#include <stdio.h>
int main()
{
  char a = -128;
  printf("%u\n",a);
  return 0;
}
  • 10000000000000000000000010000000 -128原碼
  • 11111111111111111111111101111111 -128反碼
  • 11111111111111111111111110000000 -128補碼
  • 截斷 10000000 a
  • 整形提升11111111111111111111111110000000
  • 所以最后輸出11111111111111111111111110000000對應的十進制數,是一個很大的數

例5

下面程序輸出什么?

#include <stdio.h>
int main()
{
  char a = 128;
  printf("%u\n",a);
  return 0;
}
  • 10000000000000000000000010000000?128補碼
  • 截斷:10000000?a補碼
  • 整形提升:11111111111111111111111110000000
  • 所以最后輸出11111111111111111111111110000000對應的數,一個很大的數

整形提升是真實存在的,但是我們平時感覺不到他的存在

其他操作符如int,floatdouble等大于等于int的操作符,之間的轉換,就要用到算術轉換了

總結

原文鏈接:https://blog.csdn.net/weixin_64116522/article/details/127927688

欄目分類
最近更新