2013-02-10 1 views
0

나는이 임무를 끝내고있는 것처럼 느껴진다. 그러나 그것이 다른 모든 시간에만 제대로 작동하는 이유를 이해하지 못한다. 내가 입력하면 "FFFFFFFF"내 프로그램의 인쇄 아웃 :signbit 인쇄하기

0xFFFFFFFF를

signBit 1, 255 expBits, 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; 
} 
+2

사용자의 번호를'getNextHexInt'에 입력했지만,'printNumberData'는 또 다른'scanf'와 함께 입력을 다시 요청합니다! – nneonneo

+0

이것은 거의 문제를 해결합니다. 감사! – numbplum

답변

0

여기에 희망이 Heres는 잠깐

프로그램에서 그것을 확인 병, 작동하지만, 표시,

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

내가 서두에 그것을 입력했는지 수행하기위한 코드입니다 -

#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; 
} 
0

당신은 getNextHexInt에 사용자의 번호를 입력하는 기호에 대한 몇 가지 이유로 1 만 printNumberDatascanf으로 다시 입력을 요청합니다. 입력 i이 이미 getNextHexInt에서 사용자 입력으로 설정되었으므로 두 번째 scanf이 필요하지 않습니다.