網站首頁 編程語言 正文
一、類型之間的轉換
C語言中的數據類型可以進行轉換
- 強制類型轉換
- 隱式類型轉換
二、強制類型轉換
強制類型轉換的語法
- (Type)var_name;
- (Type)value;
強制類型轉換的結果
- 目標類型能夠容納目標值:結果不變
- 目標類型不能容納目標值:結果將產生截斷
注意:不是所有的強制類型轉換都能成功,當不能進行強制類型轉換時,編譯器將產生錯誤信息(比如將自定義數據類型轉換成基本數據類型)。
下面看一段強制類型轉換的代碼:
#include <stdio.h>
struct TS
{
int i;
int j;
};
struct TS ts;
int main()
{
short s = 0x1122;
char c = (char)s; // 0x22
int i = (int)s; // 0x00001122
int j = (int)3.1415; // 3
unsigned int p = (unsigned int)&ts;
//long l = (long)ts; // error
//ts = (struct TS)l; // error
printf("s = %x\n", s);
printf("c = %x\n", c);
printf("i = %x\n", i);
printf("j = %x\n", j);
printf("p = %x\n", p);
printf("&ts = %p\n", &ts);
return 0;
}
下面為輸出結果:
注意將自定義數據類型轉換成基本數據類型會報錯。
三、隱式類型轉換
隱式類型轉換是編譯器主動進行的類型轉換
注意:
低類型到高類型的隱式類型轉換是安全的,不會產生截斷
高類型到低類型的隱式類型轉換是不安全的,導致不正確的結果
四、表達式中的隱式類型轉換
隱式類型轉換的發生點
- 算術運算式中,低類型轉換為高類型
- 賦值表達式中,表達式的值轉換為左邊變量的類型
- 函數調用時,實參轉換為形參的類型
- 函數返回值,return表達式轉換為返回值類型
安全的隱式類型轉換:
下面看一段隱式類型轉換的代碼:
#include <stdio.h>
int main()
{
char c = 'a';
int i = c; // safe
unsigned int j = 0x11223344;
short s = j; // unsafe
printf("c = %c\n", c);
printf("i = %d\n", i);
printf("j = %x\n", j);
printf("s = %x\n", s);
printf("sizeof(c + s) = %d\n", sizeof(c + s));
return 0;
}
下面為輸出結果:
c 為 char 類型,s 為 short 類型,再進行四則運算前,各個比 int 窄的加數自動提升為 int,結果也為 int 類型,故 size 為4
五、小結
強制類型轉換由程序員負責完成
- 轉換可能產生截斷
- 轉換不區分類型的高低
- 轉換不成功時,編譯器給出錯誤信息
隱式類型轉換由編譯器自動完成
- 低類型向高類型的轉換是安全的
- 高類型向低類型的轉換是不安全的
標準C編譯器的類型檢查是比較寬松的,因此隱式類型轉換可能帶來意外的錯誤。
原文鏈接:https://blog.csdn.net/weixin_43129713/article/details/123068346
相關推薦
- 2022-12-06 Android?Doze模式下Alarm定時任務實現流程詳解_Android
- 2023-01-20 C++利用模板實現消息訂閱和分發功能_C 語言
- 2022-07-02 搭建react-typescript-webpack開發環境
- 2022-08-07 python中pd.cut()與pd.qcut()的對比及示例_python
- 2022-08-03 利用Python連接Oracle數據庫的基本操作指南_python
- 2022-06-28 ASP.NET一次性對GridView批量更新多行數據_實用技巧
- 2022-07-08 Python如何通過地址獲取變量_python
- 2023-01-17 CMakeList中自動編譯protobuf文件過程_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支