內存與c語言位操作,c語言內存地址

本文目錄一覽:

C語言和內存關係

恩,不錯,可以這麼說。

軟體是怎麼到內存並運行的呢?這個內存地址有何關係呢?

就拿任何一個windows程序來說,程序的入口點都是WinMain,這個WinMain在內存的什麼地方呢?

在win7之前,只要你不修改鏈接器選項,這個WinMain一定是在內存的0X400000.

任何程序都需要操作系統內核支持,操作系統的內核的地址是0X80000000~4GB之間。

其他的庫文件,比如C語言中支持字元串函數(如strcap)的庫在400000與80000000之間。

可見,硬碟上的exe文件在進入內存之前,就已經明確知道自己會在內存的什麼位置。

當然,這裡有個4GB虛擬地址空間的概念:在32位系統中,系統為每個exe文件分配了一個4GB的虛擬空間,無論你是否安了4G內存。很顯然,很多庫,特別是系統內核,都是能共用的,所以你的系統能同時運行多個需要4GB虛擬空間的程序。

這個和C語言的指針有何關係呢?

舉個簡單例子:每個exe文件一般需要系統的dll文件才能運行,在exe文件的開頭,有一個表記錄了該exe需要那個dll中的哪個函數。由於dll地址是固定的,函數地址為相對於該dll地址的偏移地址,所以exe能在4GB空間中找到它需要的函數。你可以通過exe文件的基地址找到這個表,這個基地址在每個程序運行時由系統交給了exe程序,這個基地址就是一個指針。然後你能修改這個指針,所以以後每次調用這個函數時,程序將轉跳到你自己的代碼中。這其實就是c語言中的函數指針的概念。

在彙編語言中是沒有指針的,因為指針本質上就是內存中的地址。exe文件和dll文件中各種基地址和偏移地址,就是你所說的「無數個指針」。

當然,以上解釋是非常淺薄的,指針、內存、地址的概念是簡單的,但在實際的系統中卻非常複雜。如果你想了解一些底層的,本質的問題,可以在學習C語言之後參考一些彙編語言,windows底層編程等書籍,比如《Windows via C/C++ 第五版》《Intel彙編語言程序設計 第五版》就是兩本很好的入門教程。

C語言高低位互換操作

在看圖形處理源碼的時候有一段宏看不懂,就寫了一個demo自己看了一下。

還是不大熟悉C語言的位操作。

這個宏挺有意思

注意 括弧的位置很重要

((const uint8_t*)(x)) 這相當於把x所在的內存當做一段uint8類型的指針,索引x的第0位,因為是小端機,低位存低位元組,所以[0]位存的是低位元組,[1]位存的是高位元組。

這樣想的話,這個宏其實很簡單了,就是把16位的無符號數,按照8位一個單位高低位互換

事實也證明如此,程序輸出如下

「c語言允許直接訪問物理地址,能進行位操作」是什麼意思啊

就是使用C語言能夠直接定位物理內存的地址,即通過內存地址(如0xfa283401)得到該地址上的數據。

計算機中的數據都是以位(bit,比特)來作為基本單位的,C語言能直接對位進行操作,包括求與,並,或,異或,非等。

物理地址是一個很寬泛的概念,磁碟,內存等存儲設備都有物理地址的說法。

物理內存地址指的是硬體實現上物理內存展現給外部匯流排訪問的編碼地址,其範圍等於物理內存的大小.

大家常說的物理內存就是指安裝在主板上的內存條,其實不然,在計算機的系統中,物理內存不僅包括裝在主板上的內存條(RAM),還應該包括主板BIOS晶元的ROM,顯卡上的顯存(RAM)和BIOS(ROM),以及各種PCI、PCI-E設備上的RAM和ROM。

地址空間就是對物理內存編碼(地址編碼)的範圍。

所謂編碼就是對每一個物理存儲單元(一個位元組)分配一個唯一的地址號碼,這個過程又叫做「編址」或者「地址映射」。這個過程就好像在日常生活中我們給每家每戶分配一個地址門牌號。與編碼相對應的是「定址」過程——分配一個地址號碼給一個存儲單元的目的是為了便於找到它,完成數據的讀寫,這就是「定址」,因此地址空間有時候又被稱作「定址空間」。系統不僅要給主板上的內存條編址,還要給上述的其它物理內存編址;它們都被編在同一個地址空間內,編址後的物理內存就可以被系統資源使用或佔用。

C語言的小問題,涉及內存、地址、位操作等。高手進。

C語言中對指針(地址)進行加減1的操作只能讓你移動到下一個或上一個存儲單元,而不能讓你移動一個二進位位,具體這個移動量是幾個位元組,這是由指針的類型決定的。

也就是說,在這個程序中,p是指向int型的指針(你所在操作系統規定int型為4位元組,也就是32位二進位位),因此p+1就往後挪了32個二進位位,而不是你想像的1個二進位位。假設q的類型是long int型(8位元組,64個二進位位),那麼q+1就是往後挪了64個二進位位。

達到你想法的做法(用書本上的東西),我想到的是通過位運算中是「按位與」和「右移」

即(沒上機調試,可能有錯,請看其思想):

int a=某個數,你想提取是數

int b[32]={0};

int t=1;這個t的二進位形式是0000 0000 0000 0001

int i=0;這個是移動的位數

for(i=0;i=32;i++)

b[32-i-1]=(ai)t;

思想是:假設a是0000 0000 0000 0101

那麼

當i=0時,是0000 0000 0000 0101 0000 0000 0000 0001 = 0000 0000 0000 0001 = 整型的1

當i=1時,是(右移了一位以後的)0 0000 0000 0000 010 0000 0000 0000 0001 = 0000 0000 0000 0000 = 整型的0

當i=2時,是(右移了二位以後的)00 0000 0000 0000 01 0000 0000 0000 0001 = 0000 0000 0000 0001 = 整型的1

……以此類推,這樣可以提取出來每個二進位,符合你的要求

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/182087.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-24 06:17
下一篇 2024-11-24 06:18

相關推薦

  • cmd看地址

    本文將從多個方面詳細闡述cmd看地址,包括如何查看本機IP地址、如何查看路由器IP、如何查看DNS伺服器IP等等。 一、查看本機IP地址 要查看本機IP地址,首先需要打開cmd窗口…

    編程 2025-04-29
  • Python棧操作用法介紹

    如果你是一位Python開發工程師,那麼你必須掌握Python中的棧操作。在Python中,棧是一個容器,提供後進先出(LIFO)的原則。這篇文章將通過多個方面詳細地闡述Pytho…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • 尚矽谷官網地址用法介紹

    尚矽谷是國內一家領先的技術培訓機構,提供了眾多IT職業的培訓,包括Java、Python、大數據、前端、人工智慧等方向。其官網地址為http://www.atguigu.com/。…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL資料庫 在使用Python操作MySQL之前,我們需要先連接MySQL資料庫。在Python中,我…

    編程 2025-04-29

發表回復

登錄後才能評論