亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c語言?數(shù)據(jù)存儲(chǔ)與原碼?反碼?補(bǔ)碼詳細(xì)解析

 更新時(shí)間:2022年02月10日 16:25:37   作者:誠(chéng)摯的喬治  
不知道你是否和我一樣好奇,學(xué)習(xí)編程語言的同時(shí)想,各個(gè)數(shù)據(jù)類型是怎樣在我們的內(nèi)存中儲(chǔ)存的呢,如果你仔細(xì)深入了解的話,你會(huì)了解其中的樂趣,了解科學(xué)家們的偉大,了解c語言

前言

學(xué)習(xí)本章你會(huì)了解:

1.數(shù)據(jù)類型詳細(xì)介紹

2.整形在內(nèi)存中的存儲(chǔ):以及了解原碼、補(bǔ)碼、反碼

3.大小端字節(jié)序的介紹和判斷

4.浮點(diǎn)型在內(nèi)存中的存儲(chǔ)解析

1.數(shù)據(jù)的類型介紹

在學(xué)習(xí)數(shù)據(jù)儲(chǔ)存之前,讓我們先認(rèn)識(shí)一下數(shù)據(jù)類型。以下這些數(shù)據(jù)類型是我們初學(xué)c語言時(shí)的基礎(chǔ)類型以及大小所占字節(jié)數(shù)。

比如所占字節(jié)數(shù)類型
char1//符數(shù)據(jù)的類型
shot2//短整型
int4//整形
long (規(guī)定sizeof(long)>=sizeof(int) )4//長(zhǎng)整型
long long(部分編譯器不支持)8//更長(zhǎng)的起整數(shù)
float4//單精度浮點(diǎn)數(shù)
double8//雙精度浮點(diǎn)數(shù)

還有構(gòu)造類型:

數(shù)組類型

結(jié)構(gòu)體類型struct

枚舉類型enum

聯(lián)合類型union

指針類型:

int* pa;

char* pb;

float* pc;

void* pd;

除了以上類型,實(shí)際上還有布爾類型:_Bool(專門用來表示真假的類型)

舉個(gè)栗子(在c99中可用)

#include<stdio.h>
#include<stdbool>
main()
{
_bool flag=true;
if(flat)
printf("hello world")
return 0;
}              //結(jié)果就會(huì)打印一個(gè)hello world

1.1整形家族

整形家族中包括int short long,還有char。

char也是整形家族中的嗎?

答案是:是的,因?yàn)閏har對(duì)應(yīng)的字符的ascii碼值中,字符對(duì)應(yīng)的就是整形。

在這些整形類型之中,還可以分為無符號(hào)整形和有符號(hào)整型:

int=signed int

short=signed short

long=signed long

那是否char 等于 signed char呢

結(jié)果又跟其他整形家族中的成員不同,在標(biāo)準(zhǔn)情況下char不是等于sign char~(但是在常規(guī)編譯器中是相等的)。

2.整形在數(shù)據(jù)內(nèi)存中的存儲(chǔ)

我們知道變量創(chuàng)建就是開辟空間,開辟空間的大小由數(shù)據(jù)的類型來決定。

那么數(shù)據(jù)在所在的空間是怎樣儲(chǔ)存的呢?

在vs2019中輸入:

int    a=20;
int    b=-10;

就代表在內(nèi)存中開辟四個(gè)字節(jié)的空間

 其中14 00 00 00 就是a十六進(jìn)制對(duì)應(yīng)反碼的值

和前面相同,f6 ff ff ff就是b十六進(jìn)制對(duì)應(yīng)反碼的值

我們都知道計(jì)算機(jī)都是以二進(jìn)制來存儲(chǔ)信息,那為什么在內(nèi)存圖中看到的是十六進(jìn)制呢?

這僅僅是便于觀察,當(dāng)以十六進(jìn)制儲(chǔ)存時(shí),有沒有感到反碼有點(diǎn)長(zhǎng)呢,如果換成二進(jìn)制就更不宜觀察了,故規(guī)定以十六進(jìn)制來保存。

提到這里,什么是反碼呢?為什么又反碼的出現(xiàn)呢?

2.1 原碼 反碼和補(bǔ)碼(三種整型數(shù)的表示方法)

原碼:原碼就是數(shù)字對(duì)應(yīng)二進(jìn)制的表示方法,其中最后一位數(shù)字是符號(hào)位,表示正負(fù)的,

而小字節(jié)序就是二進(jìn)制對(duì)應(yīng)的是數(shù)。

如a的原碼是:0000 0000 0000 0000 0000 1010 

反碼:反碼的數(shù)值就是在原碼的基礎(chǔ)之上進(jìn)行轉(zhuǎn)換過來的,當(dāng)數(shù)值為正數(shù)時(shí),反碼的數(shù)據(jù)大小跟原碼相同,當(dāng)數(shù)值是負(fù)數(shù)是,其反碼的值就是在原碼的基礎(chǔ)上,除了符號(hào)位,其他位都是按位取反。

補(bǔ)碼:補(bǔ)碼數(shù)值為正數(shù)時(shí),其值大小就是原碼,為負(fù)時(shí),其值的大小就是在反碼的基礎(chǔ)之上,在進(jìn)行加一。

原碼得到補(bǔ)碼取反加一即可,其實(shí)補(bǔ)碼得到原碼也是取反加一(感興趣的可以試試)

舉個(gè)栗子:

a的原碼 反碼 補(bǔ)碼

原:0000 0000 0000 0000 0001 0100 

反:0000 0000 0000 0000 0001 0100 

補(bǔ):0000 0000 0000 0000 0001 0100 

b的原碼 反碼 補(bǔ)碼

原:1000 0000 0000 0000 0000 1010

反:1111 1111   1111  1111  1111  0101

補(bǔ):1111 1111  1111   1111   1111  0110

那我們系統(tǒng)會(huì)出現(xiàn)原碼反碼和補(bǔ)碼三種表示方法呢,一種表示方法不行嗎?

我們能想到的,科學(xué)家也能想到,但一種表示方法有缺陷。

就比如說:當(dāng)計(jì)算1+(-1)的時(shí)候(計(jì)算機(jī)只能實(shí)現(xiàn)加法的運(yùn)算)

統(tǒng)一用原碼的結(jié)果是

0000 0000 0000 0000  0000 0001

1000 0000 0000 0000 0000  0001

結(jié)果是1000 0000 0000 0000 0000  0010

用補(bǔ)碼計(jì)算的結(jié)果是:

0000 0000 0000 0000 0000  0001

0111  1111  1111 1111  1111  1111

結(jié)果是1000 0000 0000 0000 0000 0000 也就是0

你是不是瞬間知道為什么要三種表示方法,為什么有補(bǔ)碼的存在了

有沒有g(shù)et到科學(xué)家的偉大之處

2.2大小端字節(jié)序序的介紹

大小端字節(jié)序分別是哪一種?

a在內(nèi)存中的數(shù)值44 33 22 11就是小端字節(jié)序

那大端字節(jié)序就是11 22 33 44

大小端字節(jié)序的定義是什么?

大端字節(jié)序:當(dāng)一個(gè)數(shù)的低字節(jié)序放在高地址處,或者高字節(jié)序的放在低地址處時(shí),就是我們所說的大端字節(jié)序。

小端字節(jié)序:當(dāng)一個(gè)數(shù)的高字節(jié)序放在低地址處,或者低字節(jié)序的放在高地址處時(shí),就是我們所說的小端字節(jié)序。

放在倒著就是小端字節(jié)序,記住它即可。

為什么數(shù)據(jù)要分大小端字節(jié)序呢?

大小端字節(jié)序來源于于喬納森·斯威夫特的小說《格列佛游記》,這是因?yàn)樵谟?jì)算機(jī)系統(tǒng)中,我們都是以字節(jié)為單位的,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為8bit,但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(看具體編譯器),另外,對(duì)于位數(shù)大于8位的處理器,例外16位的或者32位的處理器,由于寄存器寬度大于一個(gè)字節(jié),那么必然存在著一個(gè)如何將多個(gè)字節(jié)序排序的問題。因此就導(dǎo)致了大端存儲(chǔ)模式,和小端存儲(chǔ)模式。

 那么怎么判斷大小端字節(jié)序呢?

下面由一個(gè)例題來講解:(這是百度2015年系統(tǒng)工程師的筆試題)

用代碼來判斷系統(tǒng)大小端字節(jié)序:

int a;
 
char*pa=(char*)&a;
 
if(*pa==1)
 
printf("小端字節(jié)序“);
 
else
 
printf(“大端字節(jié)序”);

2.3 練習(xí)

題一:

//輸出結(jié)果是什么
#include<stdio.h>
int main()
{
char a=-1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0
}

輸出的結(jié)果分別是-1 -1 255

前面兩個(gè)很容易理解 signed char與char意思都是有符號(hào)的整數(shù),所以打印的結(jié)果都是-1.

都是對(duì)于無符號(hào)來說這時(shí)候就要進(jìn)行整形提升了

當(dāng)char型以整形來打印時(shí)過程如下:

原碼:10000001

反碼:11111110

補(bǔ)碼:11111111

unsigned整形提升后:0000 0000 0000 0000 1111 1111

這是的補(bǔ)碼同樣也是: 0000 0000 0000 0000 1111 1111

就是最終c的值。

題二:

?#include<stdio.h>
 
int main()
{
char a=-128;
printf(%u\n",a);  //u就是以無符號(hào)的類型打印出來
return 0;
}

-128的原碼: 1000 0000 0000 0000 1000 0000

反碼1111 1111 1111 1111 0111 1111

補(bǔ)碼1111  1111 1111 1111 1000 0000

因?yàn)槭莄har型 補(bǔ)碼提取后:10000000

正進(jìn)行整形提升,因?yàn)閏har是無符號(hào)整形,所以提升后:

1111 1111 1111 1111 1000 0000

再以無符號(hào)整形形式打印后原反補(bǔ)相同即:1111 1111 1111 1111 1000 0000

再轉(zhuǎn)化成十進(jìn)制:4294967169

運(yùn)行證明以如下

數(shù)據(jù)的范圍是多少呢?unsigned char與char存放的數(shù)據(jù)是否相等呢?

事實(shí)證明char與unsigned char數(shù)據(jù)范圍并不一樣

char的整形數(shù)據(jù)范圍是-128~127,而unsigned char的范圍是0~255;

(short 與unsigned short的整形取值范圍也不一樣

short的整形數(shù)據(jù)范圍是-32768~32767,而unsigned short能存儲(chǔ)的數(shù)據(jù)范圍則是0~65535

3.浮點(diǎn)型在內(nèi)存中的存儲(chǔ)

首先列出一個(gè)常見浮點(diǎn)數(shù)表示方法:

1E10 可能你并不知道這是什么意思;

實(shí)際上他的意思是1.0*10^10;

3.1 先舉一個(gè)例子

#include<stdio.h>
int main()
{
int n=9;
float*pFloat=(float*)&n;
printf("n的值為:%d\n",n);
printf("*pFloat的值為:%f\n",pFloat);
*pFloat=9.0;
printf("num的值為:%d\n",n);
printf("*pFloat的值為:%f\n",*pFloat);
return 0;
}

n的值為:9

*pFloat的值為:0.00

num的值為:1091567616

*pFloat的值為:9.000000

  這個(gè)結(jié)果是否跟你想的一樣呢?

 其實(shí)n的值與最后一個(gè)*pFloat的值可能我們很容易知道(也可能是猜的 哈哈)

在求解這道題之前讓我們先了解這個(gè)題的知識(shí)吧~

3.2 浮點(diǎn)數(shù)儲(chǔ)存的規(guī)則

IEEE(電氣和電子工程協(xié)會(huì)754標(biāo)準(zhǔn))標(biāo)準(zhǔn)規(guī)定:

任何二進(jìn)制的浮點(diǎn)數(shù)都可以以這種標(biāo)準(zhǔn)表示出來:

基本公式是:(-1)^S*M*2^E;(這里的E是無符號(hào)類型)

其中M是有效數(shù)子,E是指數(shù),S用來表示正負(fù);

舉個(gè)栗子:

5.5——10進(jìn)制的表示

轉(zhuǎn)化為二進(jìn)制的結(jié)果是:101.1;

用公式表示為:(-1)^0 (1.011)*2^2    此時(shí)S=0,M=1.011,E=2;

 對(duì)于64位浮點(diǎn)數(shù),最高位1位是符號(hào)位s,接著是11位是指數(shù)E, 剩下的52位是有效數(shù)字。

如果E為八位,他的取值范圍0~255,如果E為11為,他的取值范圍0~2047;

有兩個(gè)極限 

當(dāng)E為0時(shí),此時(shí)的真實(shí)的E為1-127=-126;此時(shí)的數(shù)值根據(jù)公式,也就是無限接近與0;

當(dāng)E為254時(shí),此時(shí)的真實(shí)的E為254-127=127;此時(shí)的數(shù)值根據(jù)公式,也就是無窮大。

說到這里,你可能有一點(diǎn)疑惑,為什么都要減一個(gè)127,這是因?yàn)楸苊獬霈F(xiàn)E為負(fù)數(shù)的情況(因?yàn)檫@里的E是無符號(hào)整形),在真實(shí)的E的基礎(chǔ)上加了127,所以為了得到求出真實(shí)的E,就需要減去一個(gè)127.

 現(xiàn)在回到原來的題目之上

0000 0000 0000 0000 0000 0000 0000 1001--九的原碼反碼與補(bǔ)碼。

這里的0 是 s;00000000為E;0000000000000000001001為m

此時(shí)(-1)^0*0.00000001*10*2^(-126)

由于float默認(rèn)只打印小數(shù)點(diǎn)后六位,所以最終打印0.000000;

九的轉(zhuǎn)化位二進(jìn)制:1.001;

1.001*2^3

=0 M=1.001 E=3;

0100 0001 0001 0000 0000 0000 0000 0000

再以整形的形式打印的話,此時(shí)的值就是0100 0001 0001 0000 0000 0000 0000 0000就是num的補(bǔ)碼,由于符號(hào)位是0,所以最終的原碼等于補(bǔ)碼。也就是1091567616

如果以浮點(diǎn)型打印的話也就是9.000000

結(jié)語:

寫的很長(zhǎng)時(shí)間,如果有用就收藏吧

到此這篇關(guān)于c語言 數(shù)據(jù)存儲(chǔ)與原碼 反碼 補(bǔ)碼詳細(xì)解析的文章就介紹到這了,更多相關(guān)c語言 數(shù)據(jù)存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解char *a與char a[]的區(qū)別

    深入理解char *a與char a[]的區(qū)別

    很多人可能或多或少知道char *a與char a[]的一些區(qū)別,但如果詳細(xì)的說出來卻不知如何說去,下面這篇文章就給大家詳細(xì)介紹了關(guān)于C語言中char *a與char a[]的區(qū)別,有需要的朋友們可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-12-12
  • C++之CNoTrackObject類和new delete操作符的重載實(shí)例

    C++之CNoTrackObject類和new delete操作符的重載實(shí)例

    這篇文章主要介紹了C++之CNoTrackObject類和new delete操作符的重載實(shí)例,是C++程序設(shè)計(jì)中比較重要的概念,需要的朋友可以參考下
    2014-10-10
  • Qt使用QCustomPlot的實(shí)現(xiàn)示例

    Qt使用QCustomPlot的實(shí)現(xiàn)示例

    QCustomPlot是一個(gè)基于Qt C++的圖形庫,用于繪制和數(shù)據(jù)可視化,并為實(shí)時(shí)可視化應(yīng)用程序提供高性能服務(wù),本文主要介紹了Qt使用QCustomPlot的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-01-01
  • C++實(shí)現(xiàn)掃雷經(jīng)典小游戲

    C++實(shí)現(xiàn)掃雷經(jīng)典小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)掃雷經(jīng)典小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++構(gòu)造函數(shù)一些常見的坑

    C++構(gòu)造函數(shù)一些常見的坑

    這篇文章主要給大家分享的是C++構(gòu)造函數(shù)一些常見的坑,文章圍繞C++構(gòu)造函數(shù)的相關(guān)資料展開關(guān)于C++構(gòu)造函數(shù)坑的內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-01-01
  • Prim(普里姆)算法求最小生成樹的思想及C語言實(shí)例講解

    Prim(普里姆)算法求最小生成樹的思想及C語言實(shí)例講解

    Prim算法能夠在帶權(quán)的圖中搜索出最小生成樹,這也是各大ACM和面試及考研題目中的熱點(diǎn),下面我們就來詳細(xì)看一下Prim(普里姆)算法求最小生成樹的思想及C語言實(shí)例講解
    2016-06-06
  • C++ new、delete(new[]、delete[])操作符重載需要注意的問題

    C++ new、delete(new[]、delete[])操作符重載需要注意的問題

    這篇文章主要介紹了C++ new、delete(new[]、delete[])操作符重載需要注意的問題,本文同時(shí)講解了兼容默認(rèn)的 new、delete 的錯(cuò)誤處理方式、多態(tài)的問題等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 詳細(xì)解析C語言中的開方實(shí)現(xiàn)

    詳細(xì)解析C語言中的開方實(shí)現(xiàn)

    這篇文章主要介紹了詳細(xì)解析C語言中的開方實(shí)現(xiàn),包括一道要求精度的整數(shù)開方的題目,需要的朋友可以參考下
    2015-08-08
  • C語言數(shù)據(jù)結(jié)構(gòu)之迷宮問題

    C語言數(shù)據(jù)結(jié)構(gòu)之迷宮問題

    這篇文章主要為大家詳細(xì)介紹了C語言數(shù)據(jù)結(jié)構(gòu)之迷宮問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 關(guān)于C++的重載運(yùn)算符和重載函數(shù)

    關(guān)于C++的重載運(yùn)算符和重載函數(shù)

    一般來說,重載運(yùn)算符在實(shí)際的項(xiàng)目開發(fā)中會(huì)經(jīng)常的用到,但如果某些自定義類型通過簡(jiǎn)短幾行代碼重載一些常用的運(yùn)算符(如:+-*/),就能讓編程工作帶來方便,需要的朋友可以參考下本文
    2023-05-05

最新評(píng)論