AMD Opteronにまたまたハマる

本日,職場の同僚と感心した一例.

#include <string>
#include <iostream>
using namespace std;
int main()
{
  unsigned int x;
  string::size_type y;
  cout<<"ui="<<sizeof(x)<<endl;
  cout<<"st="<<sizeof(y)<<endl;
  y = string::npos;
  x = y;
  cout<<"ui="<<x<<endl;
  cout<<"st="<<y<<endl;
  return(0);
}

↑このプログラム,Intel CPUのマシンでは,次のような全く同一の結果が出ていたのに...

# grep "model name" /proc/cpuinfo |uniq
model name : Intel(R) Xeon(R) CPU X3210 @ 2.13GHz
# grep flags /proc/cpuinfo |uniq
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni mo
r lahf_lm
# g++ -Wall test.cc
# ./a.out
ui=4
st=4
ui=4294967295
st=4294967295

Opteronのマシンでは,全然違う結果が.

# grep "model name" /proc/cpuinfo |uniq
model name : Dual-Core AMD Opteron(tm) Processor 2210
# grep flags /proc/cpuinfo |uniq
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy
# g++ -Wall test.cc
# ./a.out
ui=4
st=8
ui=4294967295
st=18446744073709551615

オプション-Wallを付けても何も警告が出ないので見過ごしていましたが,ここにも32bitと64bitの差が.