網站首頁 編程語言 正文
前言
C語言中有char、short、int、long、long long、float和doubole這些數據類型。這些數據類型也叫內置類型。
所占存儲空間的大?。?/p>
數據類型 | 所占存儲空間的大小 |
---|---|
char | 1個字節 |
int | 4個字節 |
short | 4個字節 |
long | 4個字節 |
long long | 32位平臺下占4個字節 ,64位平臺下占8個字節 |
float | 4個字節 |
double | 8個字節 |
類型的基本分類
整型
整型一共有char、int、short、long和long long這五種類型。
char類型的數據在內存中存放的是ASCII碼值,是整型,所以也被當成整型。
這些整型都分為有符號的整型和無符號的整型,具體可以看下面:
int a = 5;
signed int b;//有符號的整型
unsigned int c;//無符號的整型
signed是有符號的,unsigned是無符號的。
平時我們定義變量時,一般都不會加前面,只是int 變量名 = 數據,其實這就相當于signed int 變量名 = 數據。
注意 \color{#FF0000}{注意} 注意 :但是char這個類型比較特殊,在C語言的標準中,沒有定義char到底是有符號的還是無符號的,取決于編譯器。
關于無符號和無符號:
前面我們說到了int類型在內存中占4個字節,1個字節就是8個bit。
比特位即bit,是計算機最小的存儲單位。以0或1來表示比特位的值(二進制表示)。
10的二進制序列就如圖所示,其中第一位是符號位,0代表正數,1代表負數
浮點數
浮點數有float和double,一般用來表示小數。
float的表示精度低,存儲數值范圍較小。
double的表示精度高,存儲數值范圍較大。
自定義類型
自定義類型有數組類型、結構體類型、枚舉、聯合體、指針類型和空類型(void)。在這就不一一詳細講了。
整型在內存中的存儲
在了解整型在內存中的存儲前,先了解一個計算機的原碼、反碼、補碼。
原碼、反碼、補碼
數值表示形式有:二進制、八進制、十進制和十六進制。
整數的二進制也有三種表達形式:原碼、反碼、補碼。
整數中:
正數的原碼反碼補碼相同
負數的原碼反碼補碼是需要計算的
- 原碼:整數的二進制序列(注意符號位)
- 反碼:符號位不變,其它位按位取反就是反碼(0變1,1變0)
- 補碼:反碼加1就是補碼
整型在內存中存放的是補碼
接下來來驗證內存中存放的是補碼:
我定義了一個a變量,值為-10. 原碼反碼和補碼也給大家了,因為正整數的原碼、反碼和補碼相同,所以不用正整數驗證。接下來讓我們來用編譯器來調試并監視來觀察內存,來看看整型在內存中是如何存儲的。
看上圖,雖然這里面看到的是十六進制,但不要認為是以十六進制存儲的,但本質存的還是二進制序列。由此我們可以得出內存中存放的是補碼。
大端和小端
我們看到上圖a的地址和我們寫的十六進制序列是反著的,為什么?這就是大小端的問題了。
大端(存儲)模式,是指數據的低位保存在內存的高地址中,而數據的高位,保存在內存的低地址
中; 小端(存儲)模式,是指數據的低位保存在內存的低地址中,而數據的高位,,保存在內存的高地 址中。
如何判斷編譯器是大端還是小端
int main()
{
int a = 1;
if(*(char*)&a == 1)
{
printf("小端")
}
else
{
printf("大端")
}
}
如果是小端存儲存儲的順序應該是01 00 00 00 大端的話是00 00 00 01
我們對a進行取地址,然后強轉成char類型的指針然后再進行解引用,因為強制類型轉換了,所以只能訪問1個字節的地址,如果得到的1就是小端,0就是大端。
浮點數在內存中的存儲
根據國際標準IEEE(電氣和電子工程協會)754,一個浮點數 (Value) 的表示其實可以這樣表示:
也就是浮點數的實際值,等于符號位(sign bit)乘以指數偏移值(exponent bias)再乘以分數值(fraction)。
簡單來說就是對于浮點數在內存中的存儲,無論是float(32位浮點數)還是double(64)位浮點數(S),都有符號位(Exp),指數位和有效數字位(Fraction)。
對于float這種32位浮點數來說,指數位占8個bite位,有效數字位占23個bite位
對于double這種64位浮點數來說,指數位占11個bite位,有效數字位占52個bite位
符號位都是占1個bite位。
其中因為浮點數的小數部分,用二進制中難以存儲,就會存在精度不準的問題。
單精和雙精浮點數的有效數字分別是有存儲的23和52個位,加上最左手邊沒有存儲的第1個位,即是24和53個位。
由以上的計算,單精和雙精浮點數可以保證7位和15位十進制有效數字。
總結
對于數據在內存中的存儲,大家還是要重點掌握原碼、反碼和補碼的,要會計算,然后是浮點數的存儲方式,可以把它當成一個拓展知識來了解,拓展一下眼界,如果真要熟練掌握浮點數的存儲規則是要研究很多東西的,大家感興趣也可以去看一下國際標準IEEE754。
原文鏈接:https://blog.csdn.net/m0_63463510/article/details/127468844
相關推薦
- 2022-09-23 Pandas時間類型轉換與處理的實現示例_python
- 2023-03-26 TypeScript?基本數據類型實例詳解_其它
- 2023-04-06 python判斷列表為空的三種方法總結_python
- 2023-07-03 Redis 中 List(列表)類型的命令及詳解
- 2022-10-20 Swift初始化方法的使用介紹_Swift
- 2022-11-30 Python利用yarl實現輕松操作url_python
- 2022-11-06 Golang常用包使用介紹_Golang
- 2022-06-07 ASP.NET?Core服務生命周期_基礎應用
- 最近更新
-
- 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同步修改后的遠程分支