C++:ハマったエラー

1. ポインタの値をostreamで表示したいとき

// ptr.cpp
#include <iostream>

int main(void) {
  char a;
  char* p;
  p = &a;
  std::cout << " p = " << std::hex << (unsinged int) p << std::endl;
  std::cout << "&a = " << std::hex << (unsinged int) p << std::endl;
  return 0;
}

上記の記述をg++で、実行すると以下のエラーがでる。

ptr.cpp:11: error: cast from ‘char*’ to ‘unsigned int’ loses precision

原因:64bit環境のアドレスを32bitにキャストしている
対策:64bitでキャストする

// ptr.cpp
#include <iostream>
#include <stdint.h> // C++11より新しい場合は#include <cstdint>

int main(void) {
  char a;
  char* p;
  p = &a;
  std::cout << " p = " << std::hex << (uint64_t) p << std::endl;
  std::cout << "&a = " << std::hex << (uint64_t) p << std::endl;
  return 0;
}