質問

scanf関数を使用して、各番号はiが私のプログラムをしたいと思い、で入力しました 2行をプリントアウト:例えば

byte order: little-endian

> 2
     2 0x00000002
  2.00 0x40000000

> -2
    -2 0xFFFFFFFE
 -2.00 0xC0000000
私はそれが2進でプリントアウトする得ることができます しかし、私はまた、フロートを必要とし、1などのコースの私はカントのscanf 私はintとしてもスキャンする必要がある場合

私はゼロを得るのprintfしようとすると、私はfloat型としてキャストした場合。私はfloatとしてでスキャンした場合 私は正しい出力を取得します。私はint型に変換しようとしています フロートそれはまだゼロとして出てきます。

ここに私の出力があり、これまでに

Int - float - hex

byte order: little-endian

>2

         2  0x000002
      2.00  00000000
私は、フロート罰金に変換していますように

それが見えます なぜそれが進として印刷文句を言いませんか? 私はfloatとしてでスキャンする場合、私は、最初の例のように、正しい16進数表現を取得します。 これは何かのシンプルでなければなりません。私は、小数点としてでスキャンする必要がありますか 心に留めておきます 私はcygwinの

でこれを実行しています

ここで私がこれまで持っているものです..

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{


int HexNumber;
    float convert;
printf("Int - float - hex\n");



int a = 0x12345678;
unsigned char *c = (unsigned char*)(&a);
if (*c == 0x78)
{
    printf("\nbyte order: little-endian\n");
}
else
{
    printf("\nbyte order: big-endian\n");
}

printf("\n>");
scanf("%d", &HexNumber);
printf("\n%10d  ",HexNumber);
printf("%#08x",HexNumber);





convert =  (float)HexNumber; // converts but prints a zero

printf("\n%10.2f  ", convert); 
printf("%#08x", convert); // prints zeros


return 0;
}
役に立ちましたか?

解決

これを試してみてください

int i = 2;
float f = (float)i;
printf("%#08X", *( (int*) &f ));

[編集]

@Coreyます:

聞かせてのは、外に内側からそれを解析します:

&  f = address of f = say address 0x5ca1ab1e
(int*)  &f = interpret the address 0x5ca1ab1e as integer pointer
*  ((int*)&f) = get the integer at address 0x5ca1ab1e

以下は、より簡潔であるが、それはC言語の演算子の結合性と演算子の優先順位を(私はいくつかの追加括弧と空白提供の余分な明瞭さを好む)を覚えておくことは難しいます:

printf("%#08X", *(int*)&f);

他のヒント

printf("%#08x", convert); // prints zeros

あなたは(printfを使用することによって)intに渡していますが、%xにそれを渡しているInfactはされていることをfloatを言っているので、この行は、仕事に行くのではありません。

この行であなたの意図は何ですか?六角における浮動小数点数のバイナリ表現を表示するには?もしそうなら、あなたはこのような何かを試してみたいことがあります:

printf("%lx\n", *(unsigned long *)(&convert));

これは何のラインがフロートへのポインタがある変換(&convert)のアドレスを取得し、unsigned long型(ノートへのポインタにそれをキャストしているやっている:あなたがここにキャストタイプはに応じて異なる場合があることお使いのシステム上のフロートと長いの大きさ)。最後*printf

に渡される符号なしlongにunsigned long型へのポインタを参照解除されます

int型のxを考えると、フロートに変換し、その後、六角にそのフロートのバイトプリントアウトすることはこのような何かを行うことができます

show_as_float(int x) { 
   float xx = x;

   //Edit: note that this really prints the value as a double.
   printf("%f\t", xx);

   unsigned char *ptr = (unsigned char *)&xx;

   for (i=0; i<sizeof(float); i++)
       printf("%2.2x", ptr[i]);
}

標準(C ++およびC99)、それは任意のオブジェクトのバイトを表示するためにそれらを使用しても安全ですので、unsigned charための「特別な神の摂理」を与えます。 C89 / 90がそれを保証するものではありませんでしたが、それはそれにもかかわらず、合理的に移植した。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top