查看完整版本: 有關C++記憶體位址算法
頁: [1]

b2581167 發表於 2018-6-10 05:06 PM

有關C++記憶體位址算法

本帖最後由 b2581167 於 2018-8-10 10:44 PM 編輯

抱歉!!!我覺得可能是我問題描述不太清楚
現在自己看也不太懂~
應該說假設我有個int type的array
address是0fff
換成binary是
0000 1111 1111 1111 1111 1111 1111 1111 0000

每當我對address+1
他會變成0fff fff4
換成binary是
0000 1111 1111 1111 1111 1111 1111 1111 0100

fff0~fff4中間差了4B=0100 00->此兩個bits為單位B
如果加上上面的address會變成
0000 1111 1111 1111 1111 1111 1111 1111 0100 00
總共就變成34bits了


我記得我好像在哪裡看過
因為register單位為一W的資料(撇清有2W4W等...的CPU)
換算成B是4B,
而為了能節省記憶體空間,
自動省略掉B這個單位多了2個bits可以使用
所以記憶體才會以Byte的算
但我印象中記憶體位址不都是2的n次方在算的嗎
怎麼會有34bit?
抱歉= = 計組快忘光了!!!
只是想喚起一下記憶




...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

mdlin 發表於 2018-6-10 10:29 PM

你的觀念上有些問題,每一個數字是4 bit ,我不知道你所說的是什麼!
記憶體的算法要看你在什麼樣的平台上,這跟CPU的特性有關。這要看CPU是如何定址的。

johnwanz 發表於 2018-6-11 08:49 AM

你應該要先查一下計算機結構.

CPU的存取介面主要可分為, 位址線, 資料線.
位址線, 表示可以區分出幾個記憶體位址;
而資料線, 代表每個位址一次可以讀取多寬(bits)的資料.
讀一個byte, 兩個bytes, 四個bytes, 皆是基於此概念的變化.
(一個byte可能全部位址線32b都要用, 一次讀四個bytes, 只需要30條位址線)

一個0x0CCCCCC4位址, 可以一次存取最高位址線寬度的資料量依據其位址線及資料線寬度而定. 還有可能因為不同的指令, 可以在硬體一次讀4bytes時候, 只篩選出指令要的一個byte或兩個bytes.

你所謂的重點,
"每一個單位是以1byte起跳,也就是說它還有隱藏2個bits沒顯示",
其實沒法看懂你的意思, 因為不是正確的邏輯,
所以這個思考模式, 不理解你想表達的細節是什麼情況....<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

tryit244178 發表於 2018-6-12 12:00 PM

本帖最後由 tryit244178 於 2018-6-12 12:06 PM 編輯

是不是bit跟byte的單位搞錯了?1Byte = 8bits。記憶體位址則是0CCCCCC4 跟 0CCCCCC5 差1Byte



z1090128 發表於 2018-6-17 11:42 PM

位址通常都要看相關記憶體的單位,像在一些單晶片上一個位址是2 bytes<br><br><br><br><br><div></div>

kuolung1 發表於 2018-6-18 07:58 PM

應該沒有問題才對,因為 0xccccc4 是指一個位址,1 byte , 4個 byte 也是可以指到同一個位址的,

titanping 發表於 2018-7-9 11:58 AM

0CCCCCC4是第一byte  0CCCCCC5是第二byte  到底有何問題?

love88131496 發表於 2018-7-13 08:49 PM

先確定不要被文字表示式給搞混:
16進位的表示法: 0xC4, C這個代表的是4bit, 4也代表4bit, 總共是8bit, 也就是1byte
很少只用到4bit (因為電腦IC設計一次最少8bit, 只使用4bit, 還是會用8bit去存,浪費4bit)
所以,16進位表示法,通常是兩兩一組,例如 0x8C, 0x92, 或者說是偶數個,0x33221144,很少會遇到單數個的。有的話習慣前面補0, 例如: 0x01(8bit), 0x0001(16bit)

再來,妳的問題有點不懂。如果16進位表示法理解上沒問題(因為妳的"位址"是基數個,我不確定),通常不會有"少2bit, 3bit"這種情況。怎樣算錯,就是4bit。

至於char, 直接查該語言定義長度。以MSDN上的說明,他是"一個位元組",也就是1byte, 也就是8bits, 以16進位表示,最多可以放0x00~0xFF

所以回到題目,如果宣告一個char, 定址是0xCCCCCC4。所以0xCCCCCC4指向這個char, 滿滿的(char佔用8bit)。下一個定址0xCCCCCC5, 指向下一個char(8bit), 一樣滿滿的,毫無懸念

如果今天題目是宣告一個int16, 而0xCCCCCC4指向這個int16。這時候,int16佔了16bit, 2bytes。0xCCCCCC4指向int16的前一個byte(前8bits), 0xCCCCCC5指向int16的後一個byte(後8bit)。至於哪一個是高位元低位元,要看是Big Indian 或是Little Indian。所以,如果是兩個連續的int16, 第一個是0xCCCCCC4, 第二個要+2, 也就是0xCCCCCC6

所以怎算都不會"少兩個bit", 因為大家都至少對齊8bit

補充內容 (2018-7-13 08:52 PM):
以上是用硬體一次處理最低8bit為例子記算,所以0xCCCCCC4, 0xCCCCCC5相差8bit。不同電腦,定址的位元數可能會有16bit, 32bit不同。但概念一樣...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁: [1]