網(wǎng)站首頁 編程語言 正文
數(shù)據(jù)的類型介紹
類型的基本歸類
在寫數(shù)據(jù)類型的介紹之前,我們首先來簡單介紹下 release版本與debug版本之間的在內(nèi)存上的區(qū)別:
我們先將下面的一段代碼在VS中運(yùn)行一下,得到的結(jié)果是截然不同的
int i = 0;
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
將這段代碼在debug版本下得到的結(jié)果是 hehe死循環(huán),如下圖所示
從這里可以看到,hehe是在死循環(huán)的
將這段代碼在Release版本下得到的結(jié)果是 13個hehe
根本的原因是這兩個版本下,數(shù)據(jù)存儲的方式不同
以下是簡圖:
上面這張圖就展示了兩者的區(qū)別,當(dāng)編譯器從低地址處往高地址處走時,debug環(huán)境下,arr數(shù)組結(jié)束時如果再繼續(xù)往下運(yùn)行就會改變 i 的值,使 i的值初始化為0。release環(huán)境下arr數(shù)組結(jié)束時并不會改變i的值,因此并不會陷入死循環(huán)。
接著,回憶一下c語言中的數(shù)據(jù)基本類型:
1、整形家族有
char
注:字符類型的本質(zhì)是ASCII碼值,是整形,因此劃分到整形家族。
unsigned char
signed char
short
unsigned short [int]
signed short [int]
int
unsigned int
signed int
long
unsigned long [int]
signed long [int]
除了char類型,其他類型的數(shù)據(jù)在沒有特定的說明下,默認(rèn)是有符號類型。char類型取決于編譯器。
2、浮點(diǎn)數(shù)家族
float ? ?精度低,存儲的數(shù)值范圍較小
double ?精度高,存儲的數(shù)值范圍更大
3、構(gòu)造類型(自定義類型,我們可以創(chuàng)建出新的類型)
數(shù)組類型
結(jié)構(gòu)體類型 ?struct
枚舉類型 ?enum
聯(lián)合類型 ?union
4、指針類型
?int ?*pi
?char ?*pc
?float* ?pf
?void* ?pv
5、空類型
1、void 表示空類型(無類型)
2、通常應(yīng)用于函數(shù)的返回類型、函數(shù)的參數(shù)、指針類型?
看下面的代碼舉例
void test(void)
{
//第一個 void 表示函數(shù)沒有返回值
//第二個 void 表示函數(shù)不需要任何參數(shù)
printf("hehe\n");
}
int main()
{
test(1);
return 0;
}
整形在內(nèi)存中的存儲
源碼、反碼、補(bǔ)碼
計(jì)算機(jī)中的整數(shù)有三種表示方法,即原碼、反碼和補(bǔ)碼
三種表示方法均有符號位和數(shù)值位兩部分,符號位都是
用0表示“正”,用1表示“負(fù)”,而數(shù)值位負(fù)整數(shù)的三種
表示方法各不相同。
原碼:直接將二進(jìn)制按照正負(fù)數(shù)的形式翻譯成二進(jìn) 制就可以。
反碼:將原碼的符號位不變,其他位依次按位取反就可以得到了。
補(bǔ)碼:反碼+1就得到補(bǔ)碼。
正數(shù)的原碼、反碼、補(bǔ)碼都一樣,對于整形來說:數(shù)據(jù)存放內(nèi)存中其實(shí)存放的是補(bǔ)碼
具體原因我們在此不多做解釋。
關(guān)于大小端的概念
什么是大小端?其實(shí)就是數(shù)據(jù)在內(nèi)存中的存儲模式,大端存儲模式和小端存儲模式。
大端(存儲)模式:是指數(shù)據(jù)的低位保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址
中; 小端(存儲)模式:是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位,,保存在內(nèi)存的高地址中。
下面我們來看一道題目:判斷當(dāng)前機(jī)器的存儲模式是大端存儲還是小端存儲。
#include <stdio.h>
int check_sys()
{
int i = 1;
return (*(char*)&i);
//具體原因看下圖解釋
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
浮點(diǎn)型在內(nèi)存中的存儲
(-1)^S * M * 2^E
(-1)^s表示符號位,當(dāng)s=0,V為正數(shù);當(dāng)s=1,V為負(fù)數(shù)。
M表示有效數(shù)字,大于等于1,小于2。
2^E表示指數(shù)位。
例如 V=5.0 :浮點(diǎn)數(shù)存儲為 101.0
如果我們想算出S、M、E,那么小數(shù)點(diǎn)前面就只能有一位
例: V=9.5=1001.1=1.0011*2^3
因此 S=0,M=1.0011,E=3
但是,凡是都有例外,因此,并不是所有的浮點(diǎn)數(shù)都可以用這種方式表示的
例如:V=9.6=1001.10…與1001.11之間徘徊,無法精確的表示出來
float —> 4byte —>32bit
double—>8byte—>64bit
雖然double類型比float類型的精確度要大,但是他們依舊有可能無法將小數(shù)的內(nèi)存完整保存。
2、值得注意的是浮點(diǎn)數(shù)在內(nèi)存中使用S、M、E的形式來存儲的
對于32位的浮點(diǎn)數(shù),最高的1位是符號位s,
接著的8位是指數(shù)E,剩下的23位為有效數(shù)字M。 ?
對于64位的浮點(diǎn)數(shù),最高的1位是符號位S,
接著的11位是指數(shù)E,剩下的52位為有效數(shù)字M?
3、指數(shù)E是一個復(fù)雜的數(shù)
首先 E 是一個無符號整數(shù)這意味著, 如果E為8位,它的取值范圍為0 ~ 255;如果E為11位,它的取值范圍為0~2047。 但是,我們知道,科學(xué)計(jì)數(shù)法中的E是可以出現(xiàn)負(fù)數(shù)的,所以,存入內(nèi)存時E的真實(shí)值必須再加上一個中間數(shù),對于8位的E,這個中間數(shù)是 127;對于11位的E,這個中間數(shù)是1023。比如,2^10的E是10,所以保存成32位浮點(diǎn)數(shù)時,必須保存成10+127=137,即10001001。
如果有錯誤,希望大家評論或者私信指正!
原文鏈接:https://blog.csdn.net/weixin_64634186/article/details/125538721
相關(guān)推薦
- 2022-03-12 .NET?MemoryCache如何清除全部緩存_C#教程
- 2023-07-16 uniapp 中 uni.navigateTo跳轉(zhuǎn)其他頁面 并且?guī)?shù)
- 2022-02-04 關(guān)于傳統(tǒng)并行計(jì)算框架(比如MPI)和MapReduce并行計(jì)算框架比較
- 2023-07-14 pinia的常用知識點(diǎn)及搭配“script setup”的使用
- 2024-03-24 SpringBoot工具庫:解決SpringBoot2.*版本跨域問題
- 2022-11-01 golang連接MongoDB數(shù)據(jù)庫及數(shù)據(jù)庫操作指南_Golang
- 2022-04-17 SpringBoot中,redis的key和value為基本類型時需要注意的
- 2022-05-26 Python?if?else語句對縮進(jìn)的要求_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支