すべての警告とデバッグ情報 ( g++ -Wall -g
Linux など) を使用してコードをコンパイルし、警告が表示されなくなるまでコードを改善してください。デバッガーの使用方法を学ぶ (つまりgdb
、Linux 上で)
障害はおそらく次の場所にあると思います
float rgbf = *reinterpret_cast<float*>(&rgb);
これは、rgb
(つまりuint32_t
) とfloat
に同じ配置またはサイズの制約がない場合にエラーが発生する可能性があるためです。一部のシステム (プロセッサ、ABI、コンパイラ) には、異なる制約や互換性のない制約がある場合があります。
ところで、あなたのコードは、Debian/GNU/Linux/x86-64 で呼び出された GCC 4.7 でうまく動作します。
g++-4.7 -std=c++11 -Wall -g ramji.cc -o ramji
私が持っているとき
#include <cstdint>
#include <iostream>
int main(int argc, char**argv)
{
uint32_t r,g,b;
r = (uint32_t)145;
g = (uint32_t)131;
b = (uint32_t)139;
std::cout << "r=" << r << " g=" << g << " b=" << b << std::endl;
uint32_t rgb = ((uint32_t)r << 16 | (uint32_t)g << 8 | (uint32_t)b);
std::cout << "rgb=" << rgb << std::endl;
float rgbf = *reinterpret_cast<float*>(&rgb);
std::cout << "rgbf=" << rgbf << std::endl;
uint32_t rgbnew = *(reinterpret_cast<uint32_t *>(&rgbf));
std::cout << "rgbnew=" << rgb << std::endl;
uint8_t rnew = (rgbnew >> 16) & 0x0000ff;
uint8_t gnew = (rgbnew >> 8) & 0x0000ff;
uint8_t bnew = (rgbnew) & 0x0000ff;
std::cout << "rnew=" << rnew << " gnew=" << gnew
<< " bnew=" << bnew << std::endl;
return 0;
}
実行時に警告もクラッシュもありません。
C++11準拠<cstdint>
のコンパイラが必要であることに注意してください。