型変換について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

型変換について

#1

投稿記事 by » 15年前

ネットでC++のソースを見てると
例えば

float a;
long b;

// 色々な処理

a = *(float*)&b;

ということをしているのを見かけたんですが

a = (float)b;

とどう違うんでしょうか?

ドラ

Re:型変換について

#2

投稿記事 by ドラ » 15年前

> 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:型変換について

#3

投稿記事 by » 15年前

一見同じように見えて全然違ったんですね。

今考えると、以前見かけたソースはfloat型をfloat型のビットパターンのままシフト演算やビット演算したかったのだろうと思います。
ただ、自分はfloat型の仕組みについてさっぱり理解してないので何をしてるのか分かりませんでしたが^^;

分かりやすい解説、ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る