ページ 1 / 1
型変換について
Posted: 2010年6月27日(日) 19:47
by 蒼
ネットでC++のソースを見てると
例えば
float a;
long b;
// 色々な処理
a = *(float*)&b;
ということをしているのを見かけたんですが
a = (float)b;
とどう違うんでしょうか?
Re:型変換について
Posted: 2010年6月28日(月) 20:24
by ドラ
> a = *(float*)&b;
long* を float* にキャストすることによってポインタが指す先にある
変数のビットパターンの解釈方法を無理やり変えています。
つまり、bと同じビットパターンを持つfloat型の値をaに代入しています。
この行為に何の意味があるのかは分かりません。
> a = (float)b;
long型のbの値をできるだけ維持したまま、float型の値に変換しています。
整数型と浮動小数点型では数値の表現形式が異なるのでaとbのビットパターンは異なります。
以下のコードの実行結果を見ると分かりやすいかもしれません。
long型とfloat型は共に4byte(1byte = 8bit)であることを仮定しています。
#include <iostream>
#include <iomanip>
void PrintBit(const void *ptr)
{
const unsigned long *p = static_cast<const unsigned long*>(ptr);
std::ios::fmtflags save = std::cout.flags();
std::cout.unsetf(std::ios::dec);
std::cout << std::hex << std::setfill('0');
std::cout << std::setw(2) << ((*p & 0xff000000) >> 24);
std::cout << std::setw(2) << ((*p & 0x00ff0000) >> 16);
std::cout << std::setw(2) << ((*p & 0x0000ff00) >> 8);
std::cout << std::setw(2) << ((*p & 0x000000ff));
std::cout.flags(save);
}
void PrintValue(long val)
{
PrintBit(&val);
std::cout << '\t' << val << std::endl;
}
void PrintValue(float val)
{
std::ios::fmtflags save = std::cout.flags();
PrintBit(&val);
std::cout << '\t' << std::showpoint << val << std::endl;
std::cout.flags(save);
}
int main()
{
float a;
long b = 1234L;
a = *(float*)&b;
std::cout << "a = *(float*)&b;\n";
std::cout << "a : ";
PrintValue(a);
std::cout << "b : ";
PrintValue(b);
std::cout << "------------------------------" << std::endl;
a = (float)b;
std::cout << "a = (float)b;\n";
std::cout << "a : ";
PrintValue(a);
std::cout << "b : ";
PrintValue(b);
return 0;
}
Re:型変換について
Posted: 2010年6月28日(月) 21:49
by 蒼
一見同じように見えて全然違ったんですね。
今考えると、以前見かけたソースはfloat型をfloat型のビットパターンのままシフト演算やビット演算したかったのだろうと思います。
ただ、自分はfloat型の仕組みについてさっぱり理解してないので何をしてるのか分かりませんでしたが^^;
分かりやすい解説、ありがとうございました。