作者eugenehsu (Rainy day)
看板C_and_CPP
标题Re: [问题] type casting
时间Tue Jul 4 02:23:46 2006
欧欧 刚刚发现了abcdefghi大大与cplusplus大大的提示後, 发现了一些蛛丝马迹
我终於知道下面的判断是在干麻了
: if( *(int*)(h+3) != 0x01020304 )
: printf("not in supported byte order");
这要追朔到当初cpu再设计的时候, 对记忆体的存取方法
有分Big-Endian 跟Little-Endian 两种
现今的intel跟amd的cpu都是Little-Endian, 也就是这个主题我的上一篇回文一样
超过 1 byte的资料型态在记忆体中是倒着存放 (请参考我的上一篇回文范例)
而除了intel跟amd的cpu, 其他家的cpu几乎都是Big-Endian
也就是超过 1 byte的资料型态在记忆体中是顺着存放
总之这个判断式在判断你的cpu的种类
如果种类不合, 就印出"not in supported byte order"
至於Big-Endian 跟Little-Endian这个名词是怎麽来的, 很有趣
他出自於《格利佛游记》
说明如下:
最後我们讲一则有趣的故事。为什麽字元的排序设计,要叫做大头或小头呢?
虽然从前面的解释,我们看得出意义,但是这背後其实有一个故事。
Big-Endian 和 Little-Endian 并不是计算机工程师定的名称,而是英文作家
Jonathan Swift 在将近 300 年前创造的名词!这个名词出现於 Swift 创作的着名小
说 "Gulliver's Travels",中文通常翻译作《格利佛游记》或者《大小人国历险记》
或者《小人国历险记》之类的,许多读者大概在童年时期读过这本书的童话版节译本。
这部故事书里,有一个虚构的『小人国』,称为 Lilliput。格利佛意外抵达 Lilliput
的时候,该国正在内战。内战分成两大派系 (没有派系就没有内战):Big-Endian 和
Little-Endian。
Big-Endian 和 Little-Endian 为了一件很可笑的小事而分成派系: Big-Endian
(保守派) 坚持要从鸡蛋比较大的那一头敲开蛋壳 (大头开蛋),而 Little-Endian (
改革派) 坚持要从鸡蛋比较小的那一头敲开蛋壳 (小头开蛋)。鸡蛋比较大的那一头叫做
big-end,因此支持大头开蛋者就叫做 big-endian;同理,另一派就叫做
little-endian 了。作者其实可能要藉用这个情节,来讽刺当时在英国的政治与宗教时
事。後来,计算机科学家也在争吵关於 byte order 的问题:究竟是把高位的字元放在前
面比较好、还是放在後面比较好?一位当时在美国南加大的计算机科学家
Danny Cohen 在 1980 年 4 月 1 日,发表了标题为
"On Holy Wars and a Plea for Peace" 的文章 (後来在 1981 年刊登於 IEEE 的
Computer 期刊),把这场计算机科学家的论战比喻成格利佛在小人国遇见的 Big-Endian
和 Little-Endian 两派之内战。这是非常有趣的譬喻,一直流传至今,成为这两种硬
体设计理念的正式代名词。可见,如果童话书读得透彻,长大後可以应用在伟大的论证
上。
参考资料出处 :
http://libai.math.ncu.edu.tw/bcc16/pool/1.33.shtml
※ 引述《masam (科学面)》之铭言:
: 小弟最近在读一个程式,其中有一段程式码看不是很懂......
: 假设有一个字元阵列h
: 那麽以下的code中
: if( *(int*)(h+3) != 0x01020304 )
: printf("not in supported byte order");
: 这个if的目的是在做什麽?
: 我的认知是(h+3)指的是h[3]的记忆体位址,type是char*
: 所以(int*)(h+3)会把一个type是char*的资料转型成int*再丢出来
: 这时候丢出来的东西指的是一个type为int*的资料,指到某一个int
: 最後再用*去把这个int取出来
: 可是h+3这个位址不是OS assign的吗?
: 那麽去对这个位址做处理有什麽意义吗?
: 我想应该是我的观念有错
: 麻烦指点一下迷津,谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.158.140
1F:推 abcdefghi:目前流行的ARM,PowerPC,MIPS两种Endian都支援... 07/04 09:35
2F:→ abcdefghi:甚至实务上,很多人都习惯设成Little-Endian来用. 07/04 09:38
3F:→ eugenehsu:感谢补充 ^^ 07/04 10:36
4F:推 s8911090:但想不透为啥是h+3 07/04 13:31
5F:推 costbook:好深澳啊 07/04 20:26
6F:推 jeonjh:感谢你!很有趣的故事... 11/15 01:55