- 论坛徽章:
- 0
|
昨天,有段代码把我给弄糊涂了
*(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 。
假如,我是说假如,我在原来使用小端法的机器上,让汇编器都使用大端法表示多字节对象的字节序列顺序。会不会出现问题?会不会混乱
如果可行的话,在原来使用大的端法的机器上,让汇编器都使用小端法表示多字节对象的字节序列顺序可行不?
大家都来讨论讨论 |
|