uint32_t r,g,b;
r = (uint32_t)145;
g = (uint32_t)131;
b = (uint32_t)139;
uint32_t rgb = ((uint32_t)r << 16 | (uint32_t)g << 8 | (uint32_t)b);
float rgbf = *reinterpret_cast<float*>(&rgb);
uint32_t rgbnew = *(reinterpret_cast<uint32_t *>(&rgbf));
uint8_t rnew = (rgbnew >> 16) & 0x0000ff;
uint8_t gnew = (rgbnew >> 8) & 0x0000ff;
uint8_t bnew = (rgbnew) & 0x0000ff;
当我尝试运行此代码时,行
处存在分段错误uint32_t rgb =((uint32_t)r&lt;&lt; 16 |(uint32_t)g&lt;&lt; 8 |(uint32_t)b);
事实上,在一个地方运行正常。在另一个地方,它给出了seg故障。
答案 0 :(得分:2)
请尝试使用所有警告和调试信息(例如在Linux上使用g++ -Wall -g
)编译代码并进行改进,直到没有给出警告为止。学习使用调试器(即Linux上的gdb
)
我猜这个错误可能在
float rgbf = *reinterpret_cast<float*>(&rgb);
因为如果rgb
(即uint32_t
)和float
没有相同的对齐或大小限制,这可能会触发错误。某些系统(处理器,ABI,编译器)可能有不同的&amp;他们的约束不相容。
顺便说一下,你的代码适用于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;
}
没有警告,执行时没有崩溃。
请注意<cstdint>
需要符合C++11标准的编译器。