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