網站首頁 編程語言 正文
數據類型的介紹
在前面的章節中我們基本認識到了各種數據類型,這里我們就稍微回憶以下吧
類型的意義:
- 決定了訪問內存空間的大小
- 決定了看待內存空間的視角(例如:整型和字符數據類型)
類型的基本歸類
整型家族:
char
? ? unsigned char
? ? signed char
short
? ? unsigned short [int]
? ? signed short [int]
int
? ? unsigned int
? ? signed int
long
? ? unsigned long [int]
? ? signed long [int]
浮點型家族:
float
double
構造類型:
> 數組類型
> 結構體類型?? ?struct
> 枚舉類型?? ?enum
> 聯合類型?? ?union
指針類型:
int *pi; char *pc; float *pf; void *pv;(泛型指針)
空類型:
void 表示空類型 (無類型)
通常用于 函數的返回類型、函數的參數、指針類型
//作為函數的返回類型 void f1()//不接受任何返回值 { ; } //作為函數的參數 int f2(void)//參數為void時,傳入參數會報錯 { ; } //作為指針類型 void* f3(void* pv)//參數為 void* 時,可接收任意類型的參數 { ; }
整型在內存中的存儲
計算機中的整數有三種2進制表示方法,即源碼、反碼、補碼。
三種表示方法均有符號位和數值位
符號位: " 0 " 表示 正," 1 "表示 負
數值位:
正數:
原碼、反碼、補碼相同
負數:
原碼:直接將數值按二進制翻譯
反碼:原碼符號位不變,其它位按位取反
補碼:反碼+1
我們可以在內存中的存儲看到:
這里大家可能有個疑問,為什么j
和i
在內存中會是這樣?為什么i
和 j
內部二進制會倒過來存儲呢??編譯器壞了???(bushi
如果對此事好奇,就接著往下看吧。
什么是大小端
大小端存儲是計算機的一種存儲方式,其主存儲的方式也由計算機決定。
什么是大小端存儲:
大端(存儲)模式:指的是,數據的低 (二進制)位保存在高地址中,高位保存在低地址中;
小端(存儲)模式:指的是,數據的低位保存在低地址中,高位保存在高地址中;
注意:
大小端存儲只跟單個類型數據的存儲方式有關,數組的存儲依然是由低地址向高地址進行存儲
浮點數在內存中的存儲
在認識浮點數在內存中的存儲之前,我們先看一下下面的例子:
int main() { int n = 9; float* pf = (float*)&n; printf("n的值為:%d\n", n); printf("pf的值為:%f\n", *pf); *pf = 9.0; printf("n的值為:%d\n", n); printf("pf的值為:%f\n", *pf); return 0; }
為什么輸出結果會是這樣?
想要了解其中的原因我們首先要知道浮點數在內存中的存儲規則
浮點數在內存中的存儲規則
浮點數存儲根據國際標準 IEEE (電氣工程師學會) 754 來進行存儲,具體規則如下:
- (-1)^S * M * 2^E
- (-1)^S 代表 符號位,S=0為正數,S=1為負數
- M 表示有效數字,(1 ≤ M < 2)
- 2^E表示指數位
IEEE 754規定:
對于 float
類型來說:
對于 double
類型來說:
IEEE 754對 有效數字M 和 指數E 有一些特殊的規定:
有效數字M
前面說過,1 ≤ M < 2
,也就是說,M可以寫成 1.xxxxxx
的形式,將 小數點前省略,則其中xxxxxx
就是我們所要保存的數字
指數E
對于 float
類型(E 占 8 位):E + 127
(取 0~255 中間數)
對于 double
類型(E 占 11 位):E + 1023
(取 0~2047 中間數)
舉個例子(o?v?)ノ
十進制的 5.0
想要存進去
小數點前 需要轉換成 二進制 101 . 0
根據科學計數法將其轉換,1.01 x 2^(2)
指數E 進行替換 E = 2+127 = 129 = 1000 0001(二進制)
由上可得出 S = 0
E = 1000 0001
M = 1.01
0 ?10000001 01000000000000000000000
S ? ? E ? ? ? ? ? M整理一下:
0100 0000 1010 0000 0000 0000 0000 0000
用十六進制表示:
4 ? ?0 ? ? a ? ?0 ? ?0 ? ?0 ? ?0 ? ?0
整理一下:(大端存儲)
40 a0 00 00
小端存儲:
00 00 a0 40
趁著手還熱乎,趕緊再來看看吧(/≧▽≦)/
十進制 -2.25
在內存中如何存儲?
- 符號為負
S = 1
- 小數點前正著寫二進制,小數點后按照
2^(-n)
,n = 4 (1/4=0.25),(倒著寫二進制),所以二進制為10.01
- 用科學計數表示
1.001 x 2^(1)
- 指數E進行替換
E = 1 + 127 = 128 = 1000 0000(二進制)
- 由上可得
S = 1
E = 1000 0000
M = 1.001
1 10000000 00100000000000000000000
S ? ?E ? ? ? ? ? ? M整理一下:
1100 0000 0001 0000 0000 0000 0000 0000
用十六進制表示:
c ? ? 0 ? ?1 ? ?0 ? ?0 ? ?0 ? ?0 ? ? 0
整理一下:
c0 10 00 00
小端存儲:
00 00 10 c0
注意:(特殊情況)
當指數E為邊界值時 0~255(0~1023)直接等于具體的真實值
E全為0:
直接等于0
E全為1:
直接等于具體值340282346638528859811704183484516925440.000000(2^255)
原文鏈接:https://blog.csdn.net/xiao_feng0211/article/details/126078148
相關推薦
- 2022-10-06 Python+Scipy實現自定義任意的概率分布_python
- 2022-07-09 Pytorch從0實現Transformer的實踐_python
- 2022-07-18 MVC與MVVM的區別與理解
- 2022-09-03 Python?pandas找出、刪除重復的數據實例_python
- 2022-08-28 go?zero微服務高在請求量下如何優化_Golang
- 2022-10-02 react?redux及redux持久化示例詳解_React
- 2022-02-26 Echarts - 更改圖表圖例(legend)自定義顏色(并與數據段顏色對應)
- 2022-11-03 C#事件中關于sender的用法解讀_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同步修改后的遠程分支