SPARC和x86 GCC一个C代码的不同结果

SPARC和x86 GCC一个C代码的不同结果,c,linux,gcc,solaris,sparc,C,Linux,Gcc,Solaris,Sparc,一个C代码在“SPARC Solaris 5.9”和“Linux OpenSuse 12.1 i686(x86)”上产生不同的结果 #包括 int main(int argc,char*argv[]) { char Cmd='\x00'; char-tmp[2]; char*TempBuff=&tmp; *(短*)TempBuff=(CmdOut:第一个字节:0x05,第二个字节:0x00 在“SPARC Solaris 5.9”上:>输出:第一个字节:0x00,第二个字节:0x05 为什么,为

一个C代码在“SPARC Solaris 5.9”和“Linux OpenSuse 12.1 i686(x86)”上产生不同的结果

#包括
int main(int argc,char*argv[])
{
char Cmd='\x00';
char-tmp[2];
char*TempBuff=&tmp;
*(短*)TempBuff=(CmdOut:第一个字节:0x05,第二个字节:0x00

在“SPARC Solaris 5.9”上:>输出:第一个字节:0x00,第二个字节:0x05

为什么,为什么我们得到了不同的结果


环境详情:

“SPARC Solaris 5.9”:

uname–a:SunOS V245-1 5.9通用_118558-34 sun4u sparc SUNW,Sun-Fire-V245

psrinfo–v:sparcv9处理器的工作频率为1504 MHz,具有sparcv9浮点处理器

gcc版本3.4.6


“Linux OpenSuse 12.1 i686(x86)”:

uname–a:Linux Linux-755z.site 3.1.10-1.19-desktop#1 SMP抢占周一2月25日10:32:50 UTC 2013(f0b13a3)i686 i686 i386 GNU/Linux

cat/proc/cpuinfo:Intel(R)Core(TM)2双CPU T8100@2.10GHz

gcc版本4.6.2(SUSE Linux)


下面附上两个版本的反汇编代码



如果在小端字节平台上将8位数组类型转换为短(16位),则在执行相同操作时,将得到与在大端字节平台上不同的结果


编译器不能帮你,因为这只是endianess的本质…

是的,有人写深奥而不安全的代码,我纠正它:

//*(short*)TempBuff = (Cmd << 8) | 0x5;
TempBuff[0] = 0x5;
TempBuff[1] = Cmd;

//*(短*)TempBuff=(Cmd SPARC是big-endian,Intel是little-endian。Joe>但是C和gcc必须平衡处理器架构的低级差异,或者?好吧,它是。如果你把它当作一个short,你在两个平台上都会得到相同的值。当你在抽象中查看组成short的字节时,你就会被破坏。这就变成了一个a应用程序职责。尚未在任何地方解决,因此:
*(short*)TempBuff=(Cmd有一个相当不错的解释。如果将8位数组类型强制转换为short(16位)……在所有平台上都有严格的混叠违反和未定义的行为。@ Andrew Henle:对于C++来说可能是正确的,但是对于C来说,我不这么认为:指向对象类型的指针可以转换为指向不同对象类型的指针。如果所得到的指针没有正确地引用所引用的类型,则行为未定义。o并引用您自己的话:“如果结果指针没有与引用类型正确对齐,则行为未定义”代码
*(short*)TempBuff=(Cmd
//*(short*)TempBuff = (Cmd << 8) | 0x5;
TempBuff[0] = 0x5;
TempBuff[1] = Cmd;