| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 925 人关注过本帖
标题:数值在word存储中如下例子 中的式子表示什么意思?请指教。
只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
认真拜读后很有启发多谢了。你的大作中有的地方还请再指教一下。
《對二進制數據10110000 10001010 11101101,它的十六進制表示形式為0xB08AED,十進制表示形式為11569901(其實都是同一個數,計算機就只認識二進制那個,其餘都是給人看的),是3個8位BYTE數據構成的一串,我們可以用不同的視角看待它。如果是一個完整的整數,它就是十進制11569901;如果是3個整數的數組,它就是十進制{237,138,176},十六進制的{B0,8A,ED};如果是字符串,就是CHR(237)+CHR(138)+CHR(176)》
问题1
(a)如果是3個整數的數組,它就是十進制{237,138,176}它{ }中的值是不是:237->11101101,138-->10001010,176->1011000
   它的顺序与上面二进制数据中的顺序相反,变成低 中  高。是不是你后面讲到的内存格式是低位在前,高位在后?
(b)如果是字符串,就是CHR(237)+CHR(138)+CHR(176)排列顺序相反。同上理由
(c)十六進制的{B0,8A,ED}排列顺序与上面二进制数据是一一对应的,为什么?

<WORD類型,是16位的,由2個BYTE構成,它的內存格式是{a,b},其中a是低位,b是高位(這是Intel處理器的特點,不是所有處理器都是這樣的)。對WORD值0xB0ED來說,我們現在看到B0在前、ED在後,但在計算機內存中其實是ED在前、B0在後,所有整數都是按先低後高的次序一路排列。因此,要轉換0xB0ED為C接受的內存格式,就要按同樣的順序,寫CHR(0xED)+CHR(0xB0),即所謂ED是低位、B0是高位,與人眼看到的0xB0ED相同。對RGB(red,green,blue)顏色值,是CHR(blue)+CHR(green)+CHR(red),這樣格式的內存數據,因為反過來讀,才叫RGB,這個數的十六進制形式,看起來就是藍綠紅。>

问题2
因此,要轉換0xB0ED為C接受的內存格式,就要按同樣的順序,寫CHR(0xED)+CHR(0xB0),即所謂ED是低位、B0是高位,與人眼看到的0xB0ED相同。后半句与前半句不相应,人眼看到的高位在前,低位在后,内存格式是低位在前高位在后。


[ 本帖最后由 sylknb 于 2012-1-20 16:39 编辑 ]
2012-01-20 16:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
前面一直說的是人思考數據時的邏輯順序,只有在計算機中讀、寫時,才考慮顛倒順序,而且那個顛倒的關係,是指在Intel處理器中是這樣。也就是說,如果數據不是在Intel處理器中處理,未必需要顛倒,有可能要,也有可能不要,視具體機器(有時甚至與編譯器有關)而定。在平時閱讀數據時,就按正常的數學邏輯看待,不要考慮那些問題。

在計算機中,無論讀、寫,都是1個byte進行的,不會單獨處理bit,對8位的二進制數據,不用管它哪是高哪是低,扔給計算機就是了。只有我們要處理1個byte以上數據的時候,並且把這個數據視為一個整體,才要這樣顛倒。

關鍵看數據類型聲明:在C中,聲明int x,表示變量x是16位二進制整數(此處沿用舊式說法假定int是16位的),那麼對x=1來說,它在Intel處理器中內存格式是01 00(十六進制),低位在前,高位在後,但我們的數學邏輯,它永遠是00 01(十六進制),左高右低。

如果要直觀地看到內存的數據是怎麼放的,最好用一個可以十六進制模式進行編輯的軟件(如EditPlus)查看二進制文件,那樣看容易明白許多。當我們用C語言把一個數據以二進制格式寫到文件中的時候,它就是按內存順序寫到文件中的,打開文件,我們看到的字符順序,就是內存實際格式。


[ 本帖最后由 TonyDeng 于 2012-1-20 17:12 编辑 ]

授人以渔,不授人以鱼。
2012-01-20 17:02
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
如指在Intel處理器中
對二進制數據10110000 10001010 11101101


1。如果是3個整數的數組,它就是十進制{237,138,176}
为什么237写在前面,176写在后面。写成{176,138,237}可否?



2。要轉換0xB0ED為C接受的內存格式,就要按同樣的順序,寫CHR(0xED)+CHR(0xB0),即所謂ED是低位、B0是高位,與人眼看到的0xB0ED相同
怎么会相同呢?人看到是0xB0ED,内存放置的是寫CHR(0xED)+CHR(0xB0)
2012-01-20 18:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
1.這是分離了看,三個數不是整體,不用顛倒。
2.那是指計算機執行的效果跟人眼看到的相同。

授人以渔,不授人以鱼。
2012-01-20 18:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其實,我覺得你現階段沒必要過於深究這個問題。現實中極少需要用到API接口的時候,通常程序的編製,如果到了要關心本來不應關心的細節,那麼程序就比較危險了,此時應該考慮別的實現問題,除非論證表明確實需要如此,才迫不得已使用。我看你應該沒這種需求。

授人以渔,不授人以鱼。
2012-01-20 18:48
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
不是关心的事情,主要是没有C语言的基础,对书上东西看不懂,又不甘心照样画图。
1、如果是3個整數的數組,它就是十進制{237,138,176}
.“這是分離了看,三個數不是整體,不用顛倒”。我就要这个结果。它也是从低位到高位的结论。

2.那是指計算機執行的效果跟人眼看到的相同。加上效果两字让人懂了。
谢谢您!如此耐心,诲人不倦的精神值得让人感动。再祝新年全家安康,万事如意。
2012-01-20 20:42
快速回复:数值在word存储中如下例子 中的式子表示什么意思?请指教。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028341 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved