Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++で整数をfloatに代入するとどうなるか?挙動と比較結果を解説

整数型とfloat型の基本

整数型は、正の値・負の値・ゼロなど、小数部分を持たない数値を定義するためのデータ型です。そのため、小数点以下の値を保持することはできません。

一方、float(浮動小数点型)は、小数部分を持つ数値を定義するためのデータ型です。整数値はもちろん、小数も扱うことができます。

それでは、同じ値をfloatと整数の両方に代入した場合、コンパイラがどのような値を出力するのかを実際に確認してみましょう。

例1:同じ整数値をfloatとunsigned intに代入

#include <iostream>
using namespace std;
int main(){
    float f = 23;
    unsigned int x = 23;
    cout<<"Float f = "<<f<<endl;
    cout<<"Integer x = "<<x<<endl;
    f = 0xffffffff;
    x = 0xffffffff;
    cout << "f = " << f << endl;
    cout << "x = " << x << endl;
    return 0;
}

出力結果

Float f = 23
Integer x = 23
f = 4.29497e+09
x = 4294967295

このコードからわかるように、整数値をfloatに渡すと、そのまま整数として扱われ、出力も整数値として返されます。しかし注目すべきは、両者で表現できる最大値の扱いが異なるという点です。float側は指数表記(4.29497e+09)で表示されており、これはfloatの有効桁数(仮数部)の制約により丸められた値であることを示しています。

例2:整数変数をfloat値で初期化した場合

次に、逆のパターンとして、整数変数を小数値で初期化した場合の挙動を見てみましょう。

#include <iostream>
using namespace std;
int main(){
    float f = 23.768;
    unsigned int x = 23.768;
    cout<<"Float f = "<<f<<endl;
    cout<<"Integer x = "<<x<<endl;
    return 0;
}

出力結果

Float f = 23.768
Integer x = 23

この場合もプログラムは問題なくコンパイル・実行されます。整数変数は初期化時に与えられたfloat値の小数点以下を切り捨て、整数部分のみで初期化されます。なお、このような暗黙的な変換ではコンパイラによって警告が出る場合があるため、意図的に変換したい場合は明示的なキャストを使うのが安全です。

例3:floatと整数の比較

最後に、同じ値を持つfloatと整数を比較演算子で比べるとどうなるか確認します。

#include <iostream>
using namespace std;
int main(){
    float f = 0xffffffff;
    unsigned int x = 0xffffffff;
    if(f == x ){
        cout<<"TRUE";
    }
    else
        cout<<"FALSE";
    return 0;
}

出力結果

TRUE

結果はTRUEになりました。これは、==による比較の際にC++の「通常の算術変換」が働き、整数側がfloatに暗黙的に変換されるためです。0xffffffff(=4294967295)はfloatの有効桁数を超えるため変換時に丸められますが、比較時には両者が同じfloat値に丸められるため、等しいと判定されます。

このように、floatと整数は相互に代入・比較できますが、精度や表現範囲の違いによる丸めが発生することを理解しておくことが重要です。特に大きな数値や厳密な等価比較を行う場合は、予期しない結果を避けるためにデータ型の特性を十分に考慮しましょう。

  1. C++でfloatとdoubleを比較する方法|許容誤差(EPSILON)を使った実装例

    C++においてfloat型やdouble型などの浮動小数点数を比較する方法は、最終的に何を実現したいかによって異なります。浮動小数点数は内部で2進数の近似値として表現されるため、「==」演算子による単純な等価比較では意図しない結果になることがあります。そこで一般的には、許容できる誤差(イプシロン)を設定し、その範囲内であれば同じ値とみなす手法が用いられます。 理論面に深入りしすぎず、すぐに使える関数が必要で、多少の計算誤差が許容できる場合は、以下のような関数が便利です。 サンプルコード #include<iostream> using namespace std; // 許容でき

  2. C++の関係演算子とは?比較演算子の一覧と使い方を解説

    C++では、2つの変数に格納された値を比較し、それらの大小関係や等価性を判定するために関係演算子(relational operators)を使用します。関係演算子を使うことで、「ある値が別の値より大きいか」「等しいか」といった関係を簡単に調べることができます。C++で利用できる主な関係演算子は以下の通りです。演算子説明>より大きい(左辺が右辺より大きい場合に真)>=以上(左辺が右辺以上の場合に真)==等しい(両辺が等しい場合に真)!=等しくない(両辺が異なる場合に真)<=以下(左辺が右辺以下の場合に真)<より小さい(左辺が右辺より小さい場合に真)関係演算子の使い方これ