Chinaunix

标题: 讨论:编程中大端法与小端法产生的原因 [打印本页]

作者: moon2bird1    时间: 2009-12-22 10:30
标题: 讨论:编程中大端法与小端法产生的原因
昨天,有段代码把我给弄糊涂了
*(unsigned shor int *)argv == '-e'
我本意是判断argv的字符串前两字节是否为‘-e’,如果是,条件判断成立。
可结果是,当argv的字符串前两字节为‘-e’时,条件判断还是成立。而把代码改为
*(unsigned shor int *)argv == 'e-'
时,条件判断成立 。

这是为啥??

今天研究了一阵子,结论如下:

'-e'  这样的形式的值为0x2d65  十进制就是11621

在内存中,例如int  4字节:

这端为高地址端    00 00 2d 65 这端为低地址端  (多字节对象的字节序列顺序在intel 机器上使用大端法)

但是字符串在内存中是这样的:
这端为高地址端    00 00  65 2d 这端为低地址端

字符串的读取顺序是从低地址端向高地址端读取。而数据类型的读取顺序是,根据数据类型判断数据在内存上的地址端,在这个地址端上从高地址端向低地址端看(高地址端数量级高,这也是人的习惯)。

原因找到了,可产生大端法与小端法原因是什么呢?书上老说不同处理器,采用的大小端法不一样,我老觉得不是处理器硬件层面的问题

#include <stdio.h>
int main()
{
    int a=0x61626364;
    printf("%d\n",a);
}
$cc  test.c -o test
$objdump a.out -S |grep 0x61626364
80483ed:    c7 44 24 1c 64 63 62 61    movl   $0x61626364,0x1c(%esp)

我把上面的代码编译后,再反汇编,出来上面这行。这是在我intel 机器上调出来的,是大端法。
如果在小端法的机器上,出来的就会是c7 44 24 1c 61 62 63 64 。
假如,我是说假如,我在原来使用小端法的机器上,让汇编器都使用大端法表示多字节对象的字节序列顺序。会不会出现问题?会不会混乱
如果可行的话,在原来使用大的端法的机器上,让汇编器都使用小端法表示多字节对象的字节序列顺序可行不?


大家都来讨论讨论
作者: 论坛热点    时间: 2009-12-22 10:32
产生的原因就是:
方便运算和合乎逻辑的矛盾
作者: cjaizss    时间: 2009-12-22 10:37
产生的原因:没有一个标准指引
作者: 论坛热点    时间: 2009-12-22 11:22
我的理解, 如果计数法和计算机同时产生,那何为前何为后就有同一的标准,就不会出现大小端的问题了。
作者: 论坛热点    时间: 2009-12-22 11:42
我又有新的理解,两个习惯
1. 计数时人们习惯高位在前,低位在后。
2. 除计数外,人们习惯小的东西在前,大的东西在后。
计算机里采用习惯2,所以和习惯1矛盾,大小端问题悄然、油然、自然、冉冉而生。
作者: churchmice    时间: 2009-12-22 12:06
lz把大端小端刚好说反了吧
最低位在前的是小端
作者: churchmice    时间: 2009-12-22 12:10
产生的原因你可以去了解一下计算机的远古历史
世界上不是只有x86,也不是只有intel/windows
远古时候有好几家不同的公司做计算机,比如说sun/ibm,由于没有一个统一的标准,所以怎么摆放是各家自己说了算的。
后来各家的电脑都各自有了一定的气候,定标准的时候当然谁也说服不了谁,只好任由这种情况的存在了。
在处理器层面上有些处理器可以指明工作在大端还是小端模式的
顺带说一句,网络传送的时候使用的是大端模式




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2