哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++編程中整型數據在內存中存儲是怎么樣的

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

掃碼添加小助手

加入工程師交流群

1.整型的歸類

char

short

int

long

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

2.原碼、反碼和補碼

2.1 定義

計算機在表示一個數字時,是采用二進制的方式,所以為了準確表示一個數的正負,每一個有符號數都將其最高位視作是符號位,最高位為0表示正數,最高位為1表示負數。我們接下來以有符號整型int的數字進行分析。

一個有符號整數由 符號位 + 數值位 組成,數值位是其最高位,分別以0/1表示正/負

對于正數來說,反碼補碼都與原碼相同;

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

原碼:將十進制數字直接翻譯為二進制數

反碼:原碼的符號位不變,其他位按位取反

補碼:反碼+1

而對于整型來說,整型在內存中實際上是以補碼的形式進行存儲的。

2.2 補碼的意義

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

這就與計算機對于整數的運算有關了。

CPU只有加法器,減法在運算時也會被視作一個數加另一個負數??紤]到整數的最高位是符號位,兩個整數中若包含負數,以原碼直接相加得到的數一定是不對的。所以問題就變成了如何使得運算簡單而精確,既要處理符號位,又要只進行加法運算,達到以某一種二進制形式的“碼”直接相加就能得到正確結果。

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

原碼運算:

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

顯然,得到了的原碼轉化為10進制是-78,并非正確答案42。

反碼運算:

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

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

補碼運算:

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

顯然,得到了的補碼轉化為10進制原碼是42,我們得到了正確結果。

2.3 結論

綜上,我們發(fā)現,只要將兩個整數使用補碼進行運算,就不需要考慮它們的符號位了,將它們的所有位直接簡單相加即可,就能得到正確的結果。

2.4* 負數二進制補碼的快速轉化

對于char類型整數,-1用二進制補碼表示為

當我們已知一個負數的二進制補碼時,用比這個數多一位的、最高位為1、其他位全0、這里應為9位的二進制數

直接減去-1的二進制補碼得

得到的數就是十進制(-1)的絕對值,也就是1,只要加上負號,就能快速得到這個負數二進制補碼的十進制原碼。

原理十分簡單,一個負數的 原碼加上補碼 = 原碼+反碼+1 = 所有二進制位全1再加1 = 多一位的、最高位為1、其他位全0

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

3.1 什么是大小端

在內存中,數據的大小端存儲是在 字節(jié) 尺度上進行討論的

大端存儲模式:數據的 低位 保存在內存的 高地址 ,數據的 高位 保存在內存的 低地址

小端存儲模式:數據的 低位 保存在內存的 低地址 ,數據的 高位 保存在內存的 高地址

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

在計算機系統(tǒng)中,我們通常是以字節(jié)為單位存儲數據的,每個地址對應一個字節(jié)。

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

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

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

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

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

//實現方法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;}

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7345

    瀏覽量

    94988
  • 編程
    +關注

    關注

    90

    文章

    3722

    瀏覽量

    97409
  • C++
    C++
    +關注

    關注

    22

    文章

    2124

    瀏覽量

    77333

原文標題:C/C++編程知識:整型數據在內存中的存儲!講解+示例

文章出處:【微信號:xx-cyy,微信公眾號:C語言編程基礎】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    keil實現cc++混合編程

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

    keilc語言的動態(tài)分配內存

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

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

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

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

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

    CC++之間的聯系

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

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

    區(qū)別 1、面向對象編程 (OOP): C語言是一種面向過程的語言,它強調的是通過函數將任務分解為一系列步驟進行執(zhí)行。 C++C語言的基礎上擴展了面向對象的特性,支持類(class)
    發(fā)表于 12-11 06:23

    C++程序異常的處理機制

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

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

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

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

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

    如何使用閃存來保存 CYBT-343026 的數組等數據

    您好,我正在嘗試使用 CYBT-343026 構建一塊電路板。 我想將數據存儲在一個簡單的數組。T 即使斷電,數據也應該保留。我可以使用EEPROM,但由于
    發(fā)表于 06-25 06:33

    在OpenVINO? C++代碼啟用 AddressSanitizer 時的內存泄漏怎么解決?

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

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

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

    劃片機在存儲芯片制造的應用

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

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

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

    使用C++的CyAPI編寫的應用程序上遇到了問題,求解決

    我在使用 C++ 的 CyAPI 編寫的應用程序上遇到了問題。 我將 XferData() 方法與其他所有端點類型一起使用,沒有遇到任何問題。 但是,將其與 Endpoint0 一起使用會引發(fā)
    發(fā)表于 05-13 06:11
    平和县| 靖宇县| 鄯善县| 阿瓦提县| 洱源县| 安陆市| 吉林市| 泾川县| 柘城县| 东乡| 冷水江市| 河津市| 五指山市| 来安县| 清镇市| 巴林右旗| 天等县| 景东| 上杭县| 六枝特区| 达拉特旗| 伊川县| 南投市| 宜兴市| 华蓥市| 巴里| 迁安市| 江陵县| 大新县| 哈巴河县| 正镶白旗| 于都县| 红安县| 泸定县| 察隅县| 乌鲁木齐县| 吉首市| 蓝田县| 白河县| 于田县| 改则县|