2017-12-08 2 views
0

이진 파일에서 서명되지 않은 int를 읽을 수 있지만 값 중 하나가 음수로 출력됩니다.c의 이진 값 읽기

기대 값 :

45,788,331, 281,302,247, 461,354,227, 13,127, 299,215,653, 2,356,985,123,

값 인쇄 :

45,788,331, 281,302,247, 461,354,227, 13127 , 299215653, -1932982173,

여섯 번째 값은 음수로 출력되지만 서명되지 않은 int의 목록을 읽는 중입니까? 밖으로

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

int main(void) 
{ 
     FILE * fp; 
     ssize_t read; 
     int r = 0; 

     fp = fopen("numbers.bin", "rb"); 
     if (fp == NULL) 
       exit(-1); 

     while(fread(&r, sizeof(unsigned int), 1, fp) == 1) 
     { 
       printf("%d\n", r); 
     } 

     fclose(fp); 
     if (line) free(line); 

     exit(0); 
} 
+0

어떤 바이트 정렬을 사용하고 있습니까? – Grantly

+1

'r'은 서명되지 않은 것으로 선언되었습니다. – Barmar

답변

5

printf("%d\n", r);을 인쇄 아래

내 코드 진수 정수를 체결했다.

당신이 원하는 : printf("%u\n", r);

또한, rint하지 unsigned int로 선언된다.

+0

'r'의 선언도 잘못되었습니다. – Barmar

+0

@Barmar true이지만, printf는 똑같은 방식으로 해석합니다. –

+0

굉장해 이제 고마워. – Steven

1

의 유형은 int입니다. int의 32 비트 범위는 -2147483648= -(2^32)/2 ~ 2147483647 = (2^32)/2 -1 10 진수입니다.

2356985123은 부호가있는 int의 범위를 벗어납니다. rprintf("%d\n", r); r으로 인쇄 할 때 -1937982173으로 표시됩니다. -1937982173 = 2356985123 - 2^32