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

标签 c linux gcc solaris sparc

一段 C 代码在“SPARC Solaris 5.9”和“Linux OpenSuse 12.1 i686 (x86)”上带来不同的结果。

#include <stdio.h>

int main(int argc, char* argv[])
{
  char Cmd = '\x00';

  char tmp[2];
  char* TempBuff = &tmp;

  *(short*)TempBuff = (Cmd << 8) | 0x5;

  printf("Out: First byte:0x%02X, Second byte: 0x%02X\n", *(TempBuff), *(TempBuff+1) );

  return 0;
}

编译:gcc cshort.c –o cshort

在“Linux OpenSuse 12.1 i686 (x86)”上:> 输出:第一个字节:0x05,第二个字节:0x00

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

为什么,为什么我们收到不同的结果?


环境详情:

“SPARC Solaris 5.9”:

uname –a: SunOS V245-1 5.9 Generic_118558-34 sun4u sparc SUNW,Sun-Fire-V245。

psrinfo –v:sparcv9 处理器以 1504 MHz 运行,并具有 sparcv9 浮点处理器。

海湾合作委员会版本 3.4.6


“Linux OpenSuse 12.1 i686 (x86)”:

uname –a: Linux linux-755z.site 3.1.10-1.19-desktop #1 SMP PREEMPT Mon Feb 25 10:32:50 UTC 2013 (f0b13a3) i686 i686 i386 GNU/Linux

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

gcc 版本 4.6.2 (SUSE Linux)


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

disassembled code of x86 versin


disassembled code of SPARC versin

最佳答案

如果您在小端平台上将 8 位数组类型转换为 short(16 位),您将获得与在大端平台上执行相同操作时不同的结果。

编译器无法帮助你,因为这只是字节顺序的本质......

关于c - SPARC 和 x86 GCC 一个 C 代码的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22426076/

相关文章:

c - 在给定数组中查找最长的字符串后缀

C++ eigen3 线性代数库,奇怪的性能结果

c++ - 递归嵌套模板——gcc 错误?

c - 返回非 NULL 字符串会导致编译错误

c++ - 在保持递归性的同时使这个函数线程安全

调用堆栈在 2 个函数调用之间重用

c - 解码偏移宏

c - 关闭这组进程的最佳方式是什么?

ruby - 如何将 "exec"与 "DISPLAY"联系起来?

c - 跟踪/包装开放系统调用