溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言進(jìn)制轉(zhuǎn)換、整數(shù)和小數(shù)內(nèi)存存儲(chǔ)模型是什么

發(fā)布時(shí)間:2022-04-02 14:09:47 來(lái)源:億速云 閱讀:269 作者:iii 欄目:移動(dòng)開(kāi)發(fā)

本篇內(nèi)容主要講解“C語(yǔ)言進(jìn)制轉(zhuǎn)換、整數(shù)和小數(shù)內(nèi)存存儲(chǔ)模型是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“C語(yǔ)言進(jìn)制轉(zhuǎn)換、整數(shù)和小數(shù)內(nèi)存存儲(chǔ)模型是什么”吧!

 什么是進(jìn)制

進(jìn)制也就是進(jìn)位計(jì)數(shù)制,是人為定義的帶進(jìn)位的計(jì)數(shù)方法。對(duì)于任何一種進(jìn)制---N進(jìn)制,就表示每一位置上的數(shù)運(yùn)算時(shí)都是逢N進(jìn)一位。

數(shù)數(shù)相信大家都會(huì)了,比如0 1 2 3 4 5 6 7 8 9 10 11 12  13...,在數(shù)數(shù)時(shí)某一位數(shù)量滿10了就向前進(jìn)位,這種逢十進(jìn)一的進(jìn)位制,就叫十進(jìn)制。

不過(guò)在日常生活中,并不止這一種進(jìn)位制,比如1小時(shí)有60分鐘,1分鐘有60秒,滿60進(jìn)一,這就是六十進(jìn)制。

而在計(jì)算機(jī)中常用的進(jìn)制除了十進(jìn)制,還有二進(jìn)制、八進(jìn)制、十六進(jìn)制

二進(jìn)制

組成:0 1

規(guī)則:逢二進(jìn)一

表示方式:二進(jìn)制數(shù)1000010可寫成(1000010)2或?qū)懗?000010B

八進(jìn)制

組成:0 1 2 3 4 5 6 7

規(guī)則:逢八進(jìn)一

表示方式:八進(jìn)制數(shù)520可寫成(520)8或?qū)懗?20O

十六進(jìn)制

組成:0 1 2 3 4 5 6 7 8 9 A B C D E F

規(guī)則:逢十六進(jìn)一

表示方式:十六進(jìn)制的520可以寫成(520)16或?qū)懗?20H

為什么在計(jì)算機(jī)中,有這么多種進(jìn)制表示方式?

  • 方便:二進(jìn)制數(shù)中只有兩個(gè)數(shù)碼0和1,可用具有兩個(gè)不同穩(wěn)定狀態(tài)的元器件來(lái)表示一位數(shù)碼。

  • 簡(jiǎn)單:二進(jìn)制數(shù)運(yùn)算簡(jiǎn)單,大大簡(jiǎn)化了計(jì)算中運(yùn)算部件的結(jié)構(gòu),0+0=0,0+1=1,1+0=1,1+1=10。

  • 真假:二進(jìn)制天然兼容邏輯運(yùn)算。

  • 缺點(diǎn):二進(jìn)制計(jì)數(shù)在日常使用上有個(gè)不便之處,就是位數(shù)往往很長(zhǎng),讀寫不便,如:把十進(jìn)制的100000D寫成二進(jìn)制就是11000011010100000B,所以計(jì)算機(jī)領(lǐng)域我們實(shí)際采用的是十六進(jìn)制。二進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù)時(shí),長(zhǎng)度縮減為原先的約四分之一,把十進(jìn)制的100000寫成八進(jìn)制就是303240。十六進(jìn)制的一個(gè)數(shù)位可代表二進(jìn)制的四個(gè)數(shù)位。這樣,十進(jìn)制的100000寫成十六進(jìn)制就是186A0。

存儲(chǔ)單位

我們平常使用的程序,如:Windows操作系統(tǒng)、打字軟件、游戲軟件等。一般安裝在硬盤等外存上,但僅此是不能使用其功能,必須把它們調(diào)入內(nèi)存中運(yùn)行,才能真正使用其功能。

因?yàn)閮?nèi)存的讀寫速度相對(duì)于外存來(lái)說(shuō)非???,但是內(nèi)存是暫時(shí)存儲(chǔ)程序以及數(shù)據(jù)的地方。當(dāng)我們使用WPS處理文稿時(shí),當(dāng)你在鍵盤上敲入字符時(shí),它被存入內(nèi)存中。當(dāng)你選擇存盤時(shí),內(nèi)存中的數(shù)據(jù)才會(huì)被存入硬(磁)盤。

內(nèi)存是由無(wú)數(shù)個(gè)晶體管組成的(可以理解為燈泡),一個(gè)晶體管作為一比特(bit)的存儲(chǔ)器。每個(gè)晶體管可以存儲(chǔ)一個(gè)二進(jìn)制0或1,比特通常也叫做位。

位(bit): 計(jì)算機(jī)存儲(chǔ)的最小單位

字節(jié)(byte): 數(shù)據(jù)表示的最小單位

  • 一個(gè)字節(jié)通常8位長(zhǎng) 1byte = 8 bit

千字節(jié)(KB):

  • 1KB = 1024byte

  • 為什么是1024,而不是1000呢?二的十次方剛好是1024,就這么表示啦~

字節(jié)以上的轉(zhuǎn)換單位都是1024,只有一個(gè)字節(jié)等于八個(gè)位是不一樣的...

思考:為什么硬盤標(biāo)注的容量與實(shí)際的容量不一樣?

買的256G硬盤實(shí)際上只有238.4G,咱們一起來(lái)?yè)Q算一下:

硬盤廠商十進(jìn)制計(jì)算:256G = 256,000MB = 256,000,000KB = 256,000,000,000Byte  以1000為單位換算操作系統(tǒng)二進(jìn)制計(jì)算: 256G = 262,144MB = 268,435,456KB = 274,877,906,944Byte  以1024為單位換算那么256G實(shí)際容量:256,000,000,

000Byte/1024MB/1024MB/1024MB = 238.4G

所以,買256G硬盤實(shí)際上只有238.4G,而且容量越大差距也就越大了。

進(jìn)制轉(zhuǎn)換

十進(jìn)制轉(zhuǎn)其他進(jìn)制:短除法

  • 以十進(jìn)制數(shù)520為例,分別轉(zhuǎn)換為二進(jìn)制、八進(jìn)制和十六進(jìn)制,轉(zhuǎn)換過(guò)程如下:

其他進(jìn)制轉(zhuǎn)十進(jìn)制:位權(quán)相加

  • 就以上面的520D的二進(jìn)制、八進(jìn)制和十六進(jìn)制為例

  • 首先,需要對(duì)其他進(jìn)制從右往左依次開(kāi)始編號(hào),0 1 2 3 4 5 ...

  • 然后,把每一位的數(shù)通過(guò)這個(gè)公式【數(shù)值 * 基數(shù)^編號(hào)】計(jì)算,然后把結(jié)果相加,即得到轉(zhuǎn)換結(jié)果

二進(jìn)制10 0000 1000 轉(zhuǎn)十進(jìn)制

98 7654 3210 編號(hào) 10 0000 1000 B 1*2^9 + 0 + 1*2^3 = 512 + 0 + 8 = 520 D

八進(jìn)制1010 轉(zhuǎn)十進(jìn)制

3210 編號(hào) 1010 O 1*8^3 + 0 +1*8^0  = 520 + 8 =520 D

十六進(jìn)制208 轉(zhuǎn)十進(jìn)制

210 編號(hào) 208 H 2*16^2 + 0 + 8*16^0 = 2*256 + 8 = 520 H

 八進(jìn)制、十六進(jìn)制與二進(jìn)制相互轉(zhuǎn)換:拆位

八進(jìn)制與二進(jìn)制

一個(gè)八進(jìn)制數(shù)可以拆分為3個(gè)二進(jìn)制數(shù),3個(gè)二進(jìn)制數(shù)可以合成一個(gè)八進(jìn)制數(shù)

//二進(jìn)制轉(zhuǎn)八進(jìn)制 001 000 001 000 B 1   0   1   0   O      //八進(jìn)制轉(zhuǎn)二進(jìn)制 1   3   1   4   5   2   0    O     001 011 001 100 101 010 000  B

十六進(jìn)制與二進(jìn)制

一個(gè)八進(jìn)制數(shù)可以拆分為4個(gè)二進(jìn)制數(shù),4個(gè)二進(jìn)制數(shù)可以合成一個(gè)八進(jìn)制數(shù)

//二進(jìn)制轉(zhuǎn)十六進(jìn)制 0010 0000 1000 B 2    0    8    H      //十六進(jìn)制轉(zhuǎn)二進(jìn)制 1    3    1    4    5    2    0    H 0001 0011 0001 0100 0101 0010 0000 B

 為什么可以這樣拆位呢?

三位二進(jìn)制數(shù)表示的范圍是[0 - 8) -> 2^3 對(duì)于八進(jìn)制來(lái)說(shuō)剛剛好

四位二進(jìn)制數(shù)表示的范圍是[0 - 16) -> 2^4 對(duì)于十六進(jìn)制來(lái)說(shuō)剛剛好

整數(shù)的存儲(chǔ)方式

一,機(jī)器數(shù)和機(jī)器數(shù)的真值

1,機(jī)器數(shù)

一個(gè)數(shù)在計(jì)算機(jī)中的二進(jìn)制表示形式,叫做這個(gè)數(shù)的機(jī)器數(shù)。機(jī)器數(shù)是帶符號(hào)的,在計(jì)算機(jī)用機(jī)器數(shù)的最高位存放符號(hào),正數(shù)為0,負(fù)數(shù)為1。

比如,十進(jìn)制中的數(shù) +3 ,計(jì)算機(jī)字長(zhǎng)為8位,轉(zhuǎn)換成二進(jìn)制就是0000 0011,如果是 -3 ,就是 100 00011 。

那么,這里的 0000 0011 和 1000 0011 就是機(jī)器數(shù)。

2,機(jī)器數(shù)的真值

因?yàn)榈谝晃皇欠?hào)位,所以機(jī)器數(shù)的形式值就不等于真正的數(shù)值。

例如上面的有符號(hào)數(shù) 1000 0011,其最高位1代表負(fù),其真正數(shù)值是 -3,而不是形式值131(1000  0011轉(zhuǎn)換成十進(jìn)制等于131)。所以,為區(qū)別起見(jiàn),將帶符號(hào)位的機(jī)器數(shù)對(duì)應(yīng)的真正數(shù)值稱為機(jī)器數(shù)的真值。

例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

二,原碼, 反碼, 補(bǔ)碼

讓我們先了解原碼、反碼和補(bǔ)碼的概念。對(duì)于一個(gè)數(shù),計(jì)算機(jī)要使用一定的編碼方式進(jìn)行存儲(chǔ),原碼、反碼、補(bǔ)碼是機(jī)器存儲(chǔ)一個(gè)具體數(shù)字的編碼方式。

1,原碼

原碼就是機(jī)器數(shù),即用第一位表示符號(hào),其余位表示值。比如:如果是8位二進(jìn)制:

[+1]原= 0000 0001

[-1]原= 1000 0001

第一位是符號(hào)位,因?yàn)榈谝晃皇欠?hào)位,所以8位二進(jìn)制數(shù)的取值范圍就是:(即第一位不表示值,只表示正負(fù)。)

[1111 1111 , 0111 1111] 即 [-127 , 127]

原碼是人腦最容易理解和計(jì)算的表示方式。

2,反碼

正數(shù)的反碼是其本身;

負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上,符號(hào)位不變,其余各個(gè)位取反。

[+1] = [0000 0001]原 = [0000 0001]反

[-1] = [1000 0001]原 = [1111 1110]反

可見(jiàn)如果一個(gè)反碼表示的是負(fù)數(shù),人腦無(wú)法直觀地看出來(lái)它的數(shù)值。通常要將其轉(zhuǎn)換成原碼再計(jì)算。

3,補(bǔ)碼

正數(shù)的補(bǔ)碼就是其本身;

負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上,符號(hào)位不變,其余各位取反,最后+1。(也即在反碼的基礎(chǔ)上+1)

[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]補(bǔ)

[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]補(bǔ)

對(duì)于負(fù)數(shù),補(bǔ)碼表示方式也是人腦無(wú)法直觀看出其數(shù)值的。通常也需要轉(zhuǎn)換成原碼再計(jì)算其數(shù)值。

三,為何要使用原碼、反碼和補(bǔ)碼

人腦可以知道第一位是符號(hào)位,在計(jì)算的時(shí)候我們會(huì)根據(jù)符號(hào)位,選擇對(duì)真值區(qū)域的加減。(真值的概念在本文最開(kāi)頭)  但是對(duì)于計(jì)算機(jī),加減乘數(shù)已經(jīng)是最基礎(chǔ)的運(yùn)算,要設(shè)計(jì)得盡量簡(jiǎn)單,計(jì)算機(jī)辨別"符號(hào)位"顯然會(huì)讓計(jì)算機(jī)的基礎(chǔ)電路設(shè)計(jì)變得十分復(fù)雜!

于是人們想出了將符號(hào)位也參與運(yùn)算的方法。我們知道,根據(jù)運(yùn)算法則減去一個(gè)正數(shù)等于加上一個(gè)負(fù)數(shù),即:1-1 = 1 + (-1) = 0,  所以機(jī)器可以只有加法而沒(méi)有減法,這樣計(jì)算機(jī)運(yùn)算的設(shè)計(jì)就更簡(jiǎn)單了。

我們以計(jì)算十進(jìn)制表達(dá)式:1 - 1 = 0為例

首先來(lái)看原碼:

1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [1000 0010]原= -2

如果用原碼表示,讓符號(hào)位也參與計(jì)算,顯然對(duì)于減法來(lái)說(shuō),結(jié)果是不正確的。這也就是為何計(jì)算機(jī)內(nèi)部不使用原碼表示一個(gè)數(shù)。

為了解決原碼做減法的問(wèn)題, 出現(xiàn)了反碼:

1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]反+ [1111 1110]反=  [1111 1111]反= [1000 0000]原= -0

發(fā)現(xiàn)用反碼計(jì)算減法,結(jié)果的真值部分是正確的。而唯一的問(wèn)題其實(shí)就出現(xiàn)在"0"這個(gè)特殊的數(shù)值上,雖然人們理解上+0和-0是一樣的,但是0帶符號(hào)是沒(méi)有任何意義的,而且會(huì)有[0000  0000]原和[1000 0000]原兩個(gè)編碼表示0。

于是補(bǔ)碼的出現(xiàn),解決了0的符號(hào)問(wèn)題以及0的兩個(gè)編碼問(wèn)題:

1-1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]補(bǔ)+ [1111 1111]補(bǔ)= [1  0000 0000]補(bǔ)=[0000 0000]補(bǔ)=[0000 0000]原注意:進(jìn)位1不在計(jì)算機(jī)字長(zhǎng)里。

這樣0用[0000 0000]表示,而以前出現(xiàn)問(wèn)題的-0則不存在了。而且可以用[1000 0000]表示-128:-128的由來(lái)如下:

(-1) + (-127) = [1000 0001]原+ [1111 1111]原= [1111 1111]補(bǔ)+ [1000 0001]補(bǔ)= [1000  0000]補(bǔ)

-1-127的結(jié)果應(yīng)該是-128,在用補(bǔ)碼運(yùn)算的結(jié)果中,[1000  0000]補(bǔ)就是-128,但是注意因?yàn)閷?shí)際上是使用以前的-0的補(bǔ)碼來(lái)表示-128,所以-128并沒(méi)有原碼和反碼表示。(對(duì)-128的補(bǔ)碼表示[1000  0000]補(bǔ),算出來(lái)的原碼是[0000 0000]元,這是不正確的)

使用補(bǔ)碼,不僅僅修復(fù)了0的符號(hào)以及存在兩個(gè)編碼的問(wèn)題,而且還能夠多表示一個(gè)最低數(shù)。這就是為什么8位二進(jìn)制,使用原碼或反碼表示的范圍為[-127,  +127],而使用補(bǔ)碼表示的范圍為[-128, 127]。

整數(shù)的存儲(chǔ)是將十進(jìn)制為的整數(shù)轉(zhuǎn)換成其相應(yīng)的補(bǔ)碼后存儲(chǔ)。

小數(shù)的存儲(chǔ)方式

現(xiàn)如今的計(jì)算機(jī)中浮點(diǎn)數(shù)的存儲(chǔ)都是遵循IEEE754/854標(biāo)準(zhǔn),以二進(jìn)制的科學(xué)計(jì)數(shù)法存放到內(nèi)存中。

對(duì)于浮點(diǎn)數(shù)在計(jì)算機(jī)中有兩種存儲(chǔ)的精度,即單精度和雙精度,單精度是32位,雙精度是64位。

  • 符號(hào)S:0為正,1為負(fù)

  • 尾數(shù)M:小數(shù)點(diǎn)后面的部分

  • 指數(shù)E:即階碼,指明了小數(shù)點(diǎn)在數(shù)據(jù)中的位置

  • 為了讓指數(shù)表示正、負(fù)引入了偏差碼,float的為127,double的為1024

十進(jìn)制小數(shù)轉(zhuǎn)二進(jìn)制小數(shù)

  • 先把整數(shù)部分轉(zhuǎn)化為二進(jìn)制

  • 再把小數(shù)部分轉(zhuǎn)化為二進(jìn)制(用2乘以小數(shù)部分,每次將結(jié)果整數(shù)取出,然后用剩余小數(shù)部分繼續(xù)乘以2,直到小數(shù)部分為零,或者達(dá)到要求的精度為止)

以float f = 5.25為例

整數(shù)部分:5 -> 101

小數(shù)部分:0.25 -> 0.01

0.25 * 2 = 0.5  --- 0 0.5  * 2 = 1.0  --- 1   從上往下取值:0.01

最后結(jié)果:101.01 = 1.0101 * 2^2

可見(jiàn)指數(shù)實(shí)際值為2,加上偏差碼127,2 + 127 = 129,129的二進(jìn)制為10000001B,因此不難得到,8.25在內(nèi)存中的存儲(chǔ)情況為:

C語(yǔ)言進(jìn)制轉(zhuǎn)換、整數(shù)和小數(shù)內(nèi)存存儲(chǔ)模型是什么

如果把這個(gè)值作為整型使用,將是一個(gè)很大的數(shù)字,是1084751872

把這個(gè)內(nèi)存里面的值轉(zhuǎn)為十進(jìn)制小數(shù)就很簡(jiǎn)單了:

//1,首先判斷S表示的正負(fù)     + //2,計(jì)算出E實(shí)際表示的指數(shù)   1000 0001 = 129   129 - 127 = 2 //3,根據(jù)M寫出二進(jìn)制小數(shù)形式 1.0101 * 2^2 = 101.01 //4,對(duì)二進(jìn)制小數(shù)以小數(shù)點(diǎn)為界限開(kāi)始編號(hào) 210 -1-2 編號(hào) 101. 0 1 B 1*2^2 + 0 + 1*2^0 + 0*2^(-1) + 1*2^(-2) = 4 + 1 +  0.25 =5.25

 注意:

  • 在二進(jìn)制,第一個(gè)有效數(shù)字必定是“1”,因此這個(gè)“1”并不會(huì)存儲(chǔ)。

  • 浮點(diǎn)數(shù)不能精確表示其范圍內(nèi)的所有數(shù)。

  • 可精確表示的數(shù)不是均勻分布的,越靠近0越稠密。

到此,相信大家對(duì)“C語(yǔ)言進(jìn)制轉(zhuǎn)換、整數(shù)和小數(shù)內(nèi)存存儲(chǔ)模型是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI