日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言數據存儲歸類介紹_C 語言

作者:泡泡牛奶 ? 更新時間: 2022-09-25 編程語言

數據類型的介紹

在前面的章節中我們基本認識到了各種數據類型,這里我們就稍微回憶以下吧

類型的意義:

  • 決定了訪問內存空間的大小
  • 決定了看待內存空間的視角(例如:整型和字符數據類型)

類型的基本歸類

整型家族:

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

我們可以在內存中的存儲看到:

這里大家可能有個疑問,為什么ji在內存中會是這樣?為什么ij內部二進制會倒過來存儲呢??編譯器壞了???(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

欄目分類
最近更新