欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言整形提升舉例詳解

 更新時間:2023年01月09日 11:15:55   作者:Jambo!  
對于整形提升,高位需要補位,那么補什么呢,無符號數(shù)高位補0,有符號數(shù)高位補1,下面這篇文章主要給大家介紹了關于C語言整形提升的相關資料,需要的朋友可以參考下

1.什么是整形提升

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

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

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

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

2.為什么會有整形提升

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

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

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

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

整形提升是按照變量的數(shù)據(jù)類型的符號位來提升的

負數(shù)的整形提升:

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

正數(shù)的整形提升:

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是打印十進制的數(shù),所以還需整形提升,此時c10000010,符號位為:1,整形提升高位補1,最終為11111111111111111111111110000010(補碼),其原碼為10000000000000000000000001111110 ,所以這個數(shù)字輸出為-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也要發(fā)生整形提升,所以只有c不會整形提升,所以輸為c

輸出結果

這個例子能體現(xiàn)整形提升的存在

例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

輸出結果:

請?zhí)砑訄D片描述

這個例子也能體現(xiàn)整形提升的存在

例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對應的十進制數(shù),是一個很大的數(shù)

例5

下面程序輸出什么?

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

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

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

總結

到此這篇關于C語言整形提升的文章就介紹到這了,更多相關C語言整形提升內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • 詳解安卓系統(tǒng)中的Android.mk文件

    詳解安卓系統(tǒng)中的Android.mk文件

    這篇文章主要介紹了詳解安卓系統(tǒng)中的Android.mk文件,該文件用來告訴系統(tǒng)關于源代碼的編譯,需要的朋友可以參考下
    2015-07-07
  • C語言每日練習之冒泡排序

    C語言每日練習之冒泡排序

    這篇文章主要介紹了C語言冒泡排序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-11-11
  • Qt 編譯配置 Protobuf 的詳細步驟

    Qt 編譯配置 Protobuf 的詳細步驟

    在Qt項目中使用Protobuf(Protocol Buffers)可以有效地處理數(shù)據(jù)序列化和反序列化,以下是如何在Qt項目中配置和編譯Protobuf的詳細步驟,感興趣的朋友一起看看吧
    2024-07-07
  • C C++算法題解LeetCode1408數(shù)組中的字符串匹配

    C C++算法題解LeetCode1408數(shù)組中的字符串匹配

    這篇文章主要為大家介紹了C C++算法題解LeetCode1408數(shù)組中的字符串匹配示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • C語言實現(xiàn)旅游景點咨詢系統(tǒng)

    C語言實現(xiàn)旅游景點咨詢系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)旅游景點咨詢系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語言?sizeof關鍵字的具體使用

    C語言?sizeof關鍵字的具體使用

    在C語言中,sizeof是一個非常常用的關鍵字,本文主要介紹了C語言?sizeof關鍵字的具體使用,包括sizeof 關鍵字的語法、用法、特點和注意事項,感興趣的可以了解一下
    2024-02-02
  • 利用C語言實現(xiàn)順序表的實例操作

    利用C語言實現(xiàn)順序表的實例操作

    順序表是線性表中的一種重要的數(shù)據(jù)結構,也是最基礎的數(shù)據(jù)結構,所以他不僅是學習中的重點,也是應用開發(fā)非常常用的一種數(shù)據(jù)結構。這篇文章介紹如何利用C語言實現(xiàn)順序表。
    2016-08-08
  • C++中四種對象生存期和作用域以及static的用法總結分析

    C++中四種對象生存期和作用域以及static的用法總結分析

    以下是對C++中四種對象生存期和作用域以及static的用法進行了詳細的介紹,需要的朋友可以過來參考下
    2013-09-09
  • C++實現(xiàn)圖形界面時鐘表盤代碼

    C++實現(xiàn)圖形界面時鐘表盤代碼

    這篇文章主要介紹了C++實現(xiàn)圖形界面時鐘表盤代碼,涉及坐標函數(shù)的應用及圖形界面程序設計,需要的朋友可以參考下
    2014-10-10
  • C++算法學習之回溯法的應用

    C++算法學習之回溯法的應用

    這篇文章介紹了C++算法中回溯法的一些應用,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論