最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中你不知道的隱式類型轉(zhuǎn)換規(guī)則詳解

 更新時間:2024年01月29日 09:24:50   作者:庫庫的里昂  
在C語言中,類型轉(zhuǎn)換的方式一般可分為隱式類型轉(zhuǎn)換和顯示類型轉(zhuǎn)換(也稱為強制類型轉(zhuǎn)換),其中隱式類型轉(zhuǎn)換由編譯器自動進行,不需要程序員干預(yù),本文給大家詳細介紹了C語言中隱式類型轉(zhuǎn)換規(guī)則,需要的朋友可以參考下

前言

  • 在 C 語言中,類型轉(zhuǎn)換的方式一般可分為隱式類型轉(zhuǎn)換顯示類型轉(zhuǎn)換(也稱為強制類型轉(zhuǎn)換)。
  • 其中隱式類型轉(zhuǎn)換由編譯器自動進行,不需要程序員干預(yù)。
  • 隱式類型轉(zhuǎn)換通常有兩種情況:整形提升算術(shù)轉(zhuǎn)換。

一、隱式類型轉(zhuǎn)換的規(guī)則

在C語言中,自動類型轉(zhuǎn)換遵循以下規(guī)則:

  1. 若參與運算量的類型不同,則先轉(zhuǎn)換成同一類型,然后進行運算。
  2. 轉(zhuǎn)換按數(shù)據(jù)長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉(zhuǎn)成long型后再進行運算。
    a、若兩種類型的字節(jié)數(shù)不同,轉(zhuǎn)換成字節(jié)數(shù)高的類型
    b、若兩種類型的字節(jié)數(shù)相同,且一種有符號,一種無符號,則轉(zhuǎn)換成無符號類型
  3. 所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉(zhuǎn)換成double型,再作運算。
  4. char型和short型參與運算時,必須先轉(zhuǎn)換成int型。
  5. 在賦值運算中,賦值號兩邊量的數(shù)據(jù)類型不同時,賦值號右邊量的類型將轉(zhuǎn)換為左邊量的類型。如果右邊量的數(shù)據(jù)類型長度比左邊長時,將丟失一部分數(shù)據(jù),這樣會降低精度,丟失的部分按四舍五入向前舍入。

二、整型提升

C的整型算術(shù)運算總是至少以缺省整型類型的精度來進行的。

為了獲得這個精度,表達式中的字符和短整型操作數(shù)在使用之前被轉(zhuǎn)換為普通整型,這種轉(zhuǎn)換稱為整型提升。

1.整型提升的意義

表達式的整型運算要在CPU的相應(yīng)運算器件內(nèi)執(zhí)行,CPU內(nèi)整型運算器(ALU)的操作數(shù)的字節(jié)長度。

一般就是int的字節(jié)長度,同時也是CPU的通用寄存器的長度。
因此,即使兩個char類型的相加,在CPU執(zhí)行時實際上也要先轉(zhuǎn)換為CPU內(nèi)整型操作數(shù)的標準長度。

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

代碼示例:

char a,b,c;
a = b + c;

b和c的值被提升為普通整型,然后再執(zhí)行加法運算。
加法運算完成之后,結(jié)果將被截斷,然后再存儲于a中。

2.如何進行整體提升?

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

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

高位補充符號位,即補0

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

2.2負數(shù)的整型提升

高位補充符號位,即補1

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

2.3無符號整型提升

高位補0

3.整型提升實例

代碼示例1:

#include<stdio.h>
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;
}

代碼結(jié)果:

c

結(jié)果分析:

實例1中的a,b要進行整形提升,但是c不需要整形提升
a,b整形提升之后,變成了負數(shù),所以表達式 a0xb6 , b0xb600的結(jié)果是假,但是c不發(fā)生整形提升,則表達式 c==0xb6000000 的結(jié)果是真.

代碼示例2:

#include<stdio.h>
int main()
{
	char c = 1;
	printf("c=%u\n", sizeof(c));//%u按無符號整形unsigned int打印
	printf("c=%u\n", sizeof(+c));
	printf("c=%u\n", sizeof(-c));
	return 0;
}

c=1
c=4
c=4

實例2中的,c只要參與表達式運算,就會發(fā)生整形提升,表達式 +c ,就會發(fā)生提升,所以 sizeof(+c) 是4個字節(jié)。
表達式 -c 也會發(fā)生整形提升,所以 sizeof(-c) 是4個字節(jié),但是 sizeof© ,就是1個字節(jié)。

三、算術(shù)轉(zhuǎn)換

如果某個操作符的各個操作數(shù)屬于不同的類型,那么除非其中一個操作數(shù)的轉(zhuǎn)換為另一個操作數(shù)的類型,否則操作就無法進行。下面的層次體系稱為尋常算術(shù)轉(zhuǎn)換。

//排名由高到低
long double
double
float
unsigned long int
long int
unsigned int
int

如果某個操作數(shù)的類型在上面這個列表中排名較低,那么首先要轉(zhuǎn)換為另外一個操作數(shù)的類型后執(zhí)行運算。

警告:
但是算術(shù)轉(zhuǎn)換要合理,要不然會有一些潛在的問題。

代碼示例:

如果某個操作數(shù)的類型在上面這個列表中排名較低,那么首先要轉(zhuǎn)換為另外一個操作數(shù)的類型后執(zhí)行運算。

警告:
但是算術(shù)轉(zhuǎn)換要合理,要不然會有一些潛在的問題。

代碼示例:

#include<stdio.h>
int main()
{
	float f = 3.14;
    int num = f;//隱式轉(zhuǎn)換,會有精度丟失
	printf("num=%d",num);
}

代碼結(jié)果:

num=3

結(jié)果分析:

在賦值運算過程中,當(dāng)兩邊的數(shù)據(jù)類型不一樣時,右邊的數(shù)據(jù)將強制轉(zhuǎn)換為左邊的數(shù)據(jù),即float類型的b將強制轉(zhuǎn)會為int類型,小數(shù)點后面的部分直接丟棄,導(dǎo)致精度下降。

小結(jié)

以上就是C語言中你不知道的隱式類型轉(zhuǎn)換規(guī)則詳解的詳細內(nèi)容,更多關(guān)于C語言隱式類型轉(zhuǎn)換規(guī)則的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • OpenCV實現(xiàn)簡單攝像頭視頻監(jiān)控程序

    OpenCV實現(xiàn)簡單攝像頭視頻監(jiān)控程序

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)簡單攝像頭視頻監(jiān)控程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 詳解C語言如何實現(xiàn)配置文件的讀寫

    詳解C語言如何實現(xiàn)配置文件的讀寫

    這篇文章主要為大家詳細介紹了如何使用C語言實現(xiàn)配置文件的讀寫,包括定義全局宏、公用函數(shù)、比較字符串等功能,需要的可以參考一下
    2024-11-11
  • 全排列算法的原理和實現(xiàn)代碼

    全排列算法的原理和實現(xiàn)代碼

    這篇文章主要介紹了全排列算法的原理和實現(xiàn)代碼,全排列是將一組數(shù)按一定順序進行排列,如果這組數(shù)有n個,那么全排列數(shù)為n!個,需要的朋友可以參考下
    2014-08-08
  • 解析C++中虛析構(gòu)函數(shù)的作用

    解析C++中虛析構(gòu)函數(shù)的作用

    本篇文章是對C++中虛析構(gòu)函數(shù)的作用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言WinSock學(xué)習(xí)筆記

    C語言WinSock學(xué)習(xí)筆記

    本篇文章主要介紹了C語言WinSock學(xué)習(xí)筆記,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2007-12-12
  • C語言實現(xiàn)簡單五子棋游戲

    C語言實現(xiàn)簡單五子棋游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++數(shù)據(jù)結(jié)構(gòu)之搜索二叉樹的實現(xiàn)

    C++數(shù)據(jù)結(jié)構(gòu)之搜索二叉樹的實現(xiàn)

    了解搜索二叉樹是為了STL中的map和set做鋪墊,我們所熟知的AVL樹和平衡搜索二叉樹也需要搜索二叉樹的基礎(chǔ)。本文將詳解如何利用C++實現(xiàn)搜索二叉樹,需要的可以參考一下
    2022-05-05
  • C語言單鏈表實現(xiàn)學(xué)生管理系統(tǒng)

    C語言單鏈表實現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言單鏈表實現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 圖解C++的STL之stack和queue,輕松理解數(shù)據(jù)結(jié)構(gòu)

    圖解C++的STL之stack和queue,輕松理解數(shù)據(jù)結(jié)構(gòu)

    聚焦?C++?的?STL?中的?stack?和?queue,讓數(shù)據(jù)結(jié)構(gòu)變得簡單有趣!?通過圖解的方式,我們將輕松理解這兩個重要的數(shù)據(jù)結(jié)構(gòu),準備好開啟?STL?學(xué)習(xí)之旅了嗎?讓我們一起探索?stack?和?queue?的奧秘吧!
    2024-03-03
  • 詳解C++中的ANSI與Unicode和UTF8三種字符編碼基本原理與相互轉(zhuǎn)換

    詳解C++中的ANSI與Unicode和UTF8三種字符編碼基本原理與相互轉(zhuǎn)換

    在C++編程中,我們有時需要去處理字符串編碼的相關(guān)問題,常見的字符編碼有ANSI窄字節(jié)編碼、Unicode寬字節(jié)編碼及UTF8可變長編碼。很多人在處理字符串編碼問題時都會有疑惑,即便是有多年工作經(jīng)驗的朋友也可能搞不清楚。所以有必要講一下這三種字符編碼以及如何去使用它們
    2021-11-11

最新評論

平山县| 城固县| 涞水县| 桂阳县| 安新县| 镶黄旗| 阿城市| 宁晋县| 共和县| 旺苍县| 邓州市| 儋州市| 崇明县| 大丰市| 青海省| 综艺| 托克逊县| 老河口市| 尼木县| 临沭县| 新巴尔虎右旗| 肃宁县| 神农架林区| 武隆县| 化隆| 留坝县| 建湖县| 五华县| 句容市| 伽师县| 安平县| 临泉县| 蒙山县| 阿巴嘎旗| 江源县| 章丘市| 叙永县| 开江县| 江孜县| 离岛区| 阜康市|