91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++編程中整型數(shù)據(jù)在內(nèi)存中存儲(chǔ)是怎么樣的

C語言編程基礎(chǔ) ? 來源:C語言編程學(xué)習(xí)基地 ? 作者:C語言編程 ? 2021-09-01 15:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.整型的歸類

char

short

int

long

以上都分為有符號(hào)(signed)與無符號(hào)(unsigned)的類型

2.原碼、反碼和補(bǔ)碼

2.1 定義

計(jì)算機(jī)在表示一個(gè)數(shù)字時(shí),是采用二進(jìn)制的方式,所以為了準(zhǔn)確表示一個(gè)數(shù)的正負(fù),每一個(gè)有符號(hào)數(shù)都將其最高位視作是符號(hào)位,最高位為0表示正數(shù),最高位為1表示負(fù)數(shù)。我們接下來以有符號(hào)整型int的數(shù)字進(jìn)行分析。

一個(gè)有符號(hào)整數(shù)由 符號(hào)位 + 數(shù)值位 組成,數(shù)值位是其最高位,分別以0/1表示正/負(fù)

對(duì)于正數(shù)來說,反碼補(bǔ)碼都與原碼相同;

對(duì)于負(fù)數(shù)來說,符合以下3條規(guī)則:

原碼:將十進(jìn)制數(shù)字直接翻譯為二進(jìn)制數(shù)

反碼:原碼的符號(hào)位不變,其他位按位取反

補(bǔ)碼:反碼+1

而對(duì)于整型來說,整型在內(nèi)存中實(shí)際上是以補(bǔ)碼的形式進(jìn)行存儲(chǔ)的。

2.2 補(bǔ)碼的意義

有的同學(xué)可能就會(huì)問了,為什么計(jì)算機(jī)要發(fā)展出原碼、反碼、補(bǔ)碼這么多種碼呢?

這就與計(jì)算機(jī)對(duì)于整數(shù)的運(yùn)算有關(guān)了。

CPU只有加法器,減法在運(yùn)算時(shí)也會(huì)被視作一個(gè)數(shù)加另一個(gè)負(fù)數(shù)??紤]到整數(shù)的最高位是符號(hào)位,兩個(gè)整數(shù)中若包含負(fù)數(shù),以原碼直接相加得到的數(shù)一定是不對(duì)的。所以問題就變成了如何使得運(yùn)算簡(jiǎn)單而精確,既要處理符號(hào)位,又要只進(jìn)行加法運(yùn)算,達(dá)到以某一種二進(jìn)制形式的“碼”直接相加就能得到正確結(jié)果。

下面,我們以60+(-18)為例,分別用原碼、反碼、補(bǔ)碼直接進(jìn)行二進(jìn)制的運(yùn)算。

原碼運(yùn)算:

00000000 00000000 00000000 00111100( 60的原碼)+ 10000000 00000000 00000000 00010010(-18的原碼)-------------------------------------------10000000 00000000 00000000 01001110(某個(gè)數(shù)的原碼)

顯然,得到了的原碼轉(zhuǎn)化為10進(jìn)制是-78,并非正確答案42。

反碼運(yùn)算:

00000000 00000000 00000000 00111100( 60的反碼)+ 11111111 11111111 11111111 11101101(-18的反碼)-------------------------------------------100000000 00000000 00000000 00101001 截取后32位: 00000000 00000000 00000000 00101001(某個(gè)數(shù)的反碼)

顯然,得到了的反碼轉(zhuǎn)化為10進(jìn)制原碼是41,并非正確答案42,但是只與正確答案相差(+1),于是,我們就想將負(fù)數(shù)的反碼+1,即變成“補(bǔ)碼”來進(jìn)行運(yùn)算,而又正數(shù)的補(bǔ)碼是原碼本身,這時(shí)候我們看看會(huì)怎么樣呢?

補(bǔ)碼運(yùn)算:

00000000 00000000 00000000 00111100( 60的補(bǔ)碼)+ 11111111 11111111 11111111 11101110(-18的反碼)-------------------------------------------100000000 00000000 00000000 00101010 截取后32位: 00000000 00000000 00000000 00101010(某個(gè)數(shù)的補(bǔ)碼)

顯然,得到了的補(bǔ)碼轉(zhuǎn)化為10進(jìn)制原碼是42,我們得到了正確結(jié)果。

2.3 結(jié)論

綜上,我們發(fā)現(xiàn),只要將兩個(gè)整數(shù)使用補(bǔ)碼進(jìn)行運(yùn)算,就不需要考慮它們的符號(hào)位了,將它們的所有位直接簡(jiǎn)單相加即可,就能得到正確的結(jié)果。

2.4* 負(fù)數(shù)二進(jìn)制補(bǔ)碼的快速轉(zhuǎn)化

對(duì)于char類型整數(shù),-1用二進(jìn)制補(bǔ)碼表示為

當(dāng)我們已知一個(gè)負(fù)數(shù)的二進(jìn)制補(bǔ)碼時(shí),用比這個(gè)數(shù)多一位的、最高位為1、其他位全0、這里應(yīng)為9位的二進(jìn)制數(shù)

直接減去-1的二進(jìn)制補(bǔ)碼得

得到的數(shù)就是十進(jìn)制(-1)的絕對(duì)值,也就是1,只要加上負(fù)號(hào),就能快速得到這個(gè)負(fù)數(shù)二進(jìn)制補(bǔ)碼的十進(jìn)制原碼。

原理十分簡(jiǎn)單,一個(gè)負(fù)數(shù)的 原碼加上補(bǔ)碼 = 原碼+反碼+1 = 所有二進(jìn)制位全1再加1 = 多一位的、最高位為1、其他位全0

3. 大小端字節(jié)序

3.1 什么是大小端

在內(nèi)存中,數(shù)據(jù)的大小端存儲(chǔ)是在 字節(jié) 尺度上進(jìn)行討論的

大端存儲(chǔ)模式:數(shù)據(jù)的 低位 保存在內(nèi)存的 高地址 ,數(shù)據(jù)的 高位 保存在內(nèi)存的 低地址

小端存儲(chǔ)模式:數(shù)據(jù)的 低位 保存在內(nèi)存的 低地址 ,數(shù)據(jù)的 高位 保存在內(nèi)存的 高地址

3.2 為什么有大端和小端之分

在計(jì)算機(jī)系統(tǒng)中,我們通常是以字節(jié)為單位存儲(chǔ)數(shù)據(jù)的,每個(gè)地址對(duì)應(yīng)一個(gè)字節(jié)。

一個(gè)字節(jié)為8bit,但是在C語言中除了8bit的char之外,還有16bit的short,32bit的int。另外,對(duì)于位數(shù)大于8位的處理器,例如16位和32位的處理器,由于寄存器寬度大于一個(gè)字節(jié),那么必然存在著如何將多個(gè)字節(jié)安排的問題。這邊導(dǎo)致了大小端存儲(chǔ)模式的誕生。

我們以int類型的數(shù) 0x01ff4218 為例(兩個(gè)十六進(jìn)制位即為1個(gè)字節(jié)),看一下在大小端下這4個(gè)字節(jié)分別是如何分配的

3.3 寫一段代碼來判斷你的機(jī)器的大小端字節(jié)序

算法簡(jiǎn)單概括:截取4個(gè)字節(jié)大小的int整型的1個(gè)字節(jié)的低位。若機(jī)器為大端字節(jié)序,該字節(jié)存儲(chǔ)0x00;若機(jī)器為小端字節(jié)序,該字節(jié)存儲(chǔ)0x01;

#include《stdio.h》//實(shí)現(xiàn)方法1int check1(){ int i = 1; return *(char*)&i;}

//實(shí)現(xiàn)方法2int check2(){ union check { int i; char c; }ch = {1}; return ch.c;}

int main(){ int ret = check1(); if (ret == 1) { printf(“小端

”); } else { printf(“大端

”); } return 0;}

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7335

    瀏覽量

    94748
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3716

    瀏覽量

    97171
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2123

    瀏覽量

    77106

原文標(biāo)題:C/C++編程知識(shí):整型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)!講解+示例

文章出處:【微信號(hào):xx-cyy,微信公眾號(hào):C語言編程基礎(chǔ)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    keil實(shí)現(xiàn)cc++混合編程

    起因項(xiàng)目中使用到一個(gè)開源的模擬IIC的庫,封裝的比較好,但是是使用c++寫的。于是將其移植到自己的項(xiàng)目中,主要有以下三步操作: 在工程選項(xiàng) C/C++中去掉勾選
    發(fā)表于 01-26 08:58

    keilc語言的動(dòng)態(tài)分配內(nèi)存

    C程序,通常將內(nèi)存劃分為以下六個(gè)區(qū)域: (1)內(nèi)核區(qū)域。這塊區(qū)域是操作系統(tǒng)的,用戶不能使用。 (2)棧區(qū)。主要用于存放運(yùn)行函數(shù)而分配的局部變量、函數(shù)參數(shù)、返回數(shù)據(jù)、返回地址等。棧
    發(fā)表于 01-21 06:04

    C語言嵌入式系統(tǒng)編程注意事項(xiàng)-內(nèi)存操作

    C語言嵌入式系統(tǒng)編程注意事項(xiàng)之內(nèi)存操作 在嵌入式系統(tǒng)的編程,常常要求在特定的內(nèi)存單元讀寫內(nèi)容,
    發(fā)表于 01-04 07:31

    C語言與C++的區(qū)別及聯(lián)系

    C語言和C++到底是什么關(guān)系? 首先C++C語言本來就是兩種不同的編程語言,但C++確實(shí)是對(duì)
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    控制能力,這一點(diǎn)與C語言相似,使得它們?cè)谙到y(tǒng)編程、嵌入式系統(tǒng)等領(lǐng)域都得到廣泛應(yīng)用。 3、發(fā)展歷程: C++正是在C語言的基礎(chǔ)上逐步發(fā)展起來的,C
    發(fā)表于 12-11 06:51

    C語言和C++之間的區(qū)別是什么

    區(qū)別 1、面向?qū)ο?b class='flag-5'>編程 (OOP): C語言是一種面向過程的語言,它強(qiáng)調(diào)的是通過函數(shù)將任務(wù)分解為一系列步驟進(jìn)行執(zhí)行。 C++C語言的基礎(chǔ)上擴(kuò)展了面向?qū)ο蟮奶匦?,支持?class)
    發(fā)表于 12-11 06:23

    C++程序異常的處理機(jī)制

    1、什么是異常處理? 有經(jīng)驗(yàn)的朋友應(yīng)該知道,在正常的CC++編程過程難免會(huì)碰到程序不按照原本設(shè)計(jì)運(yùn)行的情況。 最常見的有除法分母為零,數(shù)組越界,
    發(fā)表于 12-02 07:12

    C/C++代碼靜態(tài)測(cè)試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate??QAC?項(xiàng)目的相對(duì)/根路徑的支持。C++?分析也得到了增強(qiáng),增加了用于檢測(cè) C++?并發(fā)問題的新檢查,并改進(jìn)了實(shí)體名稱和實(shí)
    的頭像 發(fā)表于 10-13 18:11 ?568次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代碼靜態(tài)測(cè)試工具Perforce QAC 2025.3的新特性

    技能+1!如何在樹莓派上使用C++控制GPIO?

    和PiGPIO等庫,C++可用于編程控制樹莓派的GPIO引腳。它提供了更好的性能和控制能力,非常適合對(duì)速度和精度要求較高的硬件項(xiàng)目。在樹莓派社區(qū),關(guān)于“Python
    的頭像 發(fā)表于 08-06 15:33 ?4140次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    在OpenVINO? C++代碼啟用 AddressSanitizer 時(shí)的內(nèi)存泄漏怎么解決?

    在 OpenVINO? C++代碼啟用 AddressSanitizer 時(shí)遇到內(nèi)存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    發(fā)表于 06-23 07:16

    《ESP32S3 Arduino開發(fā)指南》第三章 C/C++語言基礎(chǔ)

    3.9 循環(huán)結(jié)構(gòu) 3.1 數(shù)據(jù)類型在C/C++語言程序,對(duì)所有數(shù)據(jù)都必須指定其數(shù)據(jù)類型。
    發(fā)表于 06-10 09:20

    劃片機(jī)在存儲(chǔ)芯片制造的應(yīng)用

    劃片機(jī)(DicingSaw)在半導(dǎo)體制造主要用于將晶圓切割成單個(gè)芯片(Die),這一過程在內(nèi)存儲(chǔ)存卡(如NAND閃存芯片、SSD、SD卡等)的生產(chǎn)中至關(guān)重要。以下是劃片機(jī)在存儲(chǔ)芯片制造
    的頭像 發(fā)表于 06-03 18:11 ?1163次閱讀
    劃片機(jī)在<b class='flag-5'>存儲(chǔ)</b>芯片制造<b class='flag-5'>中</b>的應(yīng)用

    主流的 MCU 開發(fā)語言為什么是 C 而不是 C++?

    在單片機(jī)的地界兒里,C語言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。先說
    的頭像 發(fā)表于 05-21 10:33 ?1037次閱讀
    主流的 MCU 開發(fā)語言為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    C++學(xué)到什么程度可以找工作?

    C++學(xué)到什么程度可以找工作?要使用C++找到工作,特別是作為軟件開發(fā)人員或相關(guān)職位,通常需要掌握以下幾個(gè)方面: 1. **語言基礎(chǔ)**:你需要對(duì)C++的核心概念有扎實(shí)的理解,包括但不限于指針、
    發(fā)表于 03-13 10:19

    創(chuàng)建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼獲得的結(jié)果與Python代碼不同是為什么?

    創(chuàng)建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩個(gè)推理過程中使用相同的圖像和模型。 從 C++ 代碼獲得的結(jié)果與 Python* 代碼不同。
    發(fā)表于 03-06 06:22