質問するログイン新規登録

Q&A

1回答

288閲覧

C++ static_castの内部構造について

apa

総合スコア73

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

1クリップ

投稿2025/11/16 10:35

1

1

static_castに関して内部の挙動が気になり質問いたします。
単純なポインタの位置移動のみなのかなと考えていたのですが
int → float などバイトは同じだけどバイトの配置で構造が異なるものの場合
特別な処理がいるのではないかなと思いました。

もしここら辺知見がある方がおりましたらお聞きしたいです。

melian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

melian

2025/11/16 11:25

例えば Intel x64 CPU(Intel Core i5)/gcc 15.2.0の場合、以下のコードをコンパイル(アセンブリ・コードへ翻訳)すると、 int main (){  int i = 10;  float f = static_cast<float>(i);  return 0; } int 型から float 型への static_cast は整数から浮動小数点数への変換専用の命令の一つである cvtsi2ssl が使用されます。 cvtsi2ssl -8(%rbp), %xmm0 CVTSI2SS — Convert Doubleword Integer to Scalar Single Precision Floating-Point Value https://www.felixcloutier.com/x86/cvtsi2ss
apa

2025/11/16 11:41

返信ありがとうございます。 つまりポインタ以外の変換に関しては特別な翻訳を通して使い ポインタの場合は加算減算でseekしているという認識ですかね
melian

2025/11/16 11:56

はい、利用している CPU に変換命令が用意されている場合には、それがデフォルトで使われる様です。
guest

回答1

0

static_cast の仕様を見て頂ければわかるのですが、どのような振る舞いをするのかは多岐に渡る場合分けで示されています。 static_cast の効果が場合によるのですからその実装 (生成される機械語) も場合ごとに適切に処理する必要があります。 質問の事例では最終的には標準変換の浮動小数点数と汎整数の間の変換 (Floating-integral conversions) が適用されるはずです。

C++ では浮動小数点数がどのような表現を持つか規定されませんので、具体的にどういう機械語が生成するかも規定できません。 一般論としてモダンな CPU は IEEE 754 (またはそれの派生や類似した規格) の浮動小数点を取り扱いやすいように専用の命令を持っているのが普通であり、 floatint の間の変換にはそれらが使われるでしょう。

専用の命令が無いような CPU や互換性の都合でソフトウェア的に処理することもあります。 たとえば GCC を使う場合は一部のアーキテクチャでは -msoft-float というオプションを付けることで CPU の命令でなくライブラリ内の関数で処理できるようになっています。 (もちろん速度的には大きなペナルティがありますが、仕方がないこともあります。)

投稿2025/11/16 12:46

SaitoAtsushi

総合スコア5790

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問