6

scanf を使用して、各数値を入力すると、プログラムで 2 行を出力したいと思います。たとえば、

byte order: little-endian

> 2
     2 0x00000002
  2.00 0x40000000

> -2
    -2 0xFFFFFFFE
 -2.00 0xC0000000

16進数で2を出力することはできますが、フロートも必要です。もちろん、intとしてもスキャンする必要がある場合は、1つとしてスキャンできません

printf しようとしたときに float としてキャストすると、ゼロが返されます。フロートとしてスキャンすると、正しい出力が得られます。int を float に変換しようとしましたが、それでもゼロになります。

ここに私の出力があります

Int - float - hex

byte order: little-endian

>2

         2  0x000002
      2.00  00000000

float に変換しているように見えますが、なぜ 16 進数として出力されないのですか? float としてスキャンすると、最初の例のように正しい 16 進表現が得られます。これは簡単なものでなければなりません。10進数としてスキャンする必要がありますが、これを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;
}
4

3 に答える 3

8

これを試して:

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

[編集]

@コーリー:

それを裏返しに解析しましょう:

&  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);
于 2010-01-20T16:52:08.867 に答える
4
printf("%#08x", convert); // prints zeros

( を使用して)printfを渡していることを伝えているが、実際には で渡しているため、この行は機能しません。int%xfloat

この行の意図は何ですか? 浮動小数点数のバイナリ表現を 16 進数で表示するには? もしそうなら、次のようなことを試してみてください。

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

この行が行っているのは&convert、float へのポインターである convert ( ) のアドレスを取得し、それを unsigned long へのポインターにキャストすることです (注: ここでキャストする型は、float のサイズとあなたのシステムでは長いです)。最後*は、unsigned long へのポインターを、に渡される unsigned long に逆参照しています。printf

于 2010-01-20T16:48:11.043 に答える
1

int x を指定して float に変換し、その float のバイトを 16 進数で出力するには、次のようにします。

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 はそれを保証しませんでしたが、それでもかなり移植性がありました。

于 2010-01-20T17:01:42.623 に答える