2017-07-15 3 views
0

浮動小数点型を直接符号なし整数に変換しようとしていますが、その代わりに、直接的に他のものにバイトをコピーするだけの、黙示的変換数(Cスタイルまたは静的キャストはありません)はありません。 Windows Visual Studio 2015では、浮動小数点数と符号なし整数のサイズが同じです(4バイト)ので、その点で問題はないと思います。 。 。私は解決策を考え出しましたが、私がしたいことをするためのより良い方法が必要になりました。C++ Visual Studioのfloatからunsigned intに直接バイトをコピーするには?

unsigned int x = 3; 
float y = 2.4565; 
*reinterpret_cast<float*>(&x) = y; 

これは私が欲しいものを行い、存在する場合、私は、クロスプラットフォームのソリューションを好むだろう1075656524.

にXを設定します。タイプのサイズはプラットフォームによって異なる可能性があるので、不可能かもしれません。

編集:明確にするために、符号なし整数にコピーされたfloatのバイトをすべて変更しないでください。 floatに格納されているすべてのビットは、符号なし整数に格納する必要があります。また、memcpyを使用しないソリューションもありますか?非難された関数の使用を避けたい。

+3

このコードには未定義の動作があります。代わりに 'memcpy'を使用してください。あなたは何を達成したいですか?なぜあなたはそのようなキャストをしたいのですか? – geza

+1

[固定幅の整数](http://en.cppreference.com/w/cpp/types/integer)を参照して、さまざまなサイズの変数の問題を解決してください。 – user4581301

+1

あなたは何を達成しようとしていますか?この「整数」はどのように使用していますか?整数形式ではありません。クロスプラットフォームを忘れないで、エンディアンも考慮する必要があります。 –

答えて

8

私はちょうど他の

に直接バイトをコピーする(そうではないCスタイルまたは静的キャスト)、暗黙の型変換の数学一切なし符号なし整数に直接フロートを変換しようとしています1つのメモリ位置から別のメモリ位置にビットパターンをコピーするだけです。標準ライブラリ関数memcpyを使用することができます。もしsizeof(int)sizeof(float)と異なるならば、これはすべて嘘です。

unsigned int x = 3; 
float y = 2.4565; 
static_assert(sizeof(int) == sizeof(float), "Can't memcpy a float to an int"); 
memcpy(&x, &y); 

よりポータブル溶液はuint8_t又はint8_tのアレイを使用することであろう。

uint8_t x[sizeof(float)]; 
float y = 2.4565; 
memcpy(x, &y); 

ここで、配列の要素の値を調べることでビットパターンを調べることができます。

+1

ちょうどメモ:メモリは* signed * 'int'で表現する必要はありません。これは' uint8_t [4] 'でよりよく表現できます。 –

+0

完璧!ありがとうございました!浮動小数点数は符号なし整数と同じではないかもしれないことを十分に理解しています。私はちょうどメモリの仕組みを理解するためにこれをやっています。 – RazeLighter777

関連する問題