0

この課題は終わりに近づいているように感じますが、なぜそれが1回おきに正しく機能するのか理解できません。「FFFFFFFF」と入力すると、プログラムは次のように出力されます。

0xFFFFFFFF

signBit 1、expBits 255、fractBits 0x007FFFFF

QNaN

しかし、もう一度「FFFFFFFF」と入力すると、プログラムは次のように出力されます。

0xFFFFFFFF

私のプログラムは毎回正しい出力を出力するわけではありませんが、それでも毎回出力します。コードのどこでエラーが発生したかを特定するのを手伝ってくれる人はいますか?どんな助けでも大歓迎です!

ありがとう!

// do not change this code except in the following ways:
//   * write code for the following functions:
//      * bigOrSmallEndian()
//      * getNextHexInt()
//      * printLinesForNumber()
//   * change studentName by changing "I. Forgot" to your actual name

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

static char *studentName = "Tenzin Shakya";

// report whether machine is big or small endian
void bigOrSmallEndian()
{
    int num = 1;
    if(*(char *)&num == 1)
    {
      printf("\nbyte order: little-endian\n\n");
   }
   else
  {
      printf("\nbyte order: big-endian\n\n");
  } 
}

// get next int (entered in hex) using scanf()
// returns 1 (success) or 0 (failure)
// if call succeeded, return int value via i pointer
int getNextHexInt(int *i)
{
    // replace this code with the call to scanf()
    //*i = 0;
    //return 1;
    scanf ("%x", i);
    return 1;
} 

// print requested data for the given number
void printNumberData(int i)
{
    //printf("%x %0#10x\n",i,*(int *)&i);
    int tru_exp =0;
    //int stored_exp;
    int negative;
    int exponent;
    int mantissa;

    printf("\n>");
    scanf("%x", &i);
    printf("\n0x%08X",i);

    negative = !!(i & 0x80000000);
    exponent = (i & 0x7f800000) >> 23;
    mantissa = (i & 0x007FFFFF);

    printf("\nsignBit %d, ", negative);
    printf("expbits %d, ", exponent);
    printf("fractbits 0x%08X", mantissa);
    // "%#010x, ", mantissa);

    if(exponent == 0)
    {
        if(mantissa != 0)
        {
            printf("\ndenormalized ");
        }
    }
    else{
        printf("\nnormalized: ");
        tru_exp = exponent - 127;
    printf("exp = %d", tru_exp);
    }

    if(exponent == 0 && mantissa == 0 && negative == 1)
    {

    printf("\n-zero");

    }

    if(exponent ==0 && mantissa == 0 && negative == 0)
    {
    printf("\n+zero");
    }

    if(exponent == 255 && mantissa != 0 && negative == 1)
    {

    printf("\nQNaN");

    }

    if(exponent == 255 && mantissa != 0 && negative == 0)
    {

    printf("\nSNaN");

    }

    if(exponent == 0xff && mantissa == 0 && negative == 1)
    {
    printf("\n-infinity");
    }

    if(exponent == 0xff && mantissa == 0 && negative == 0)
    {
    printf("\n+infinity");
    }

    printf("\n");
    while(i != 0)
    break;
}

// do not change this function in any way
int main(int argc, char **argv)
{
    int     i;                              // number currently being analyzed
    int     nValues;                        // number of values successfully parsed by       scanf

    printf("CS201 - A01p - %s\n\n", studentName);
    bigOrSmallEndian();
    for (;;) {
        if (argc == 1)                      // allow grading script to control ...
            printf("> ");                   // ... whether prompt character is printed
        nValues = getNextHexInt(&i);
        printf("0x%08X\n", i);
        if (! nValues) {                    // encountered bad input
            printf("bad input\n");
            while (getchar() != '\n') ;     // flush bad line from input buffer
            continue;
            }
        printNumberData(i);
        if (i == 0)
            break;
        }
    printf("\n");
    return 0;
}
4

2 に答える 2

0

これを行うためのコードは次のとおりです

float myFloat;
int myInt;
memcpy(&myInt, &myFloat, 4);
int signBit = ((1 << 31) & myInt) >> 31;
printf("%i\n", signBit)

私は急いでそれをタイプしました、うまくいけばそれはうまくいきます、すぐにそれをチェックしません

ここにプログラムがありますが、何らかの理由で-1が表示されます

#include <string.h>
#include <stdio.h>

int main()
{
    float a = 1337;
    int* b = (int*)&a;

    int signbit = ((1 << 31) & *b) >> 31;
    printf("%i\n", signbit);
    a *= -1;
    signbit = ((1 << 31) & *b) >> 31;
    printf("%i\n", signbit);    

    return 0;
}
于 2013-02-10T04:20:03.487 に答える
0

にユーザー番号を入力していますgetNextHexIntprintNumberData、別のでもう一度入力を求めていますscanfscanf入力iはすでにからのユーザーの入力に設定されているため、2番目は必要ありませんgetNextHexInt

于 2013-02-10T04:24:34.090 に答える