2017-12-08 6 views
0

バイナリファイルから符号なし整数を読み取ることはできますが、値の1つが負の値を出力しています。バイナリ値をcで読み取る

期待値:

45788331、 281302247、 461354227、 13127、 299215653、 2356985123、

値をプリントアウト:

45788331、 281302247、 461354227、 13127 、 299215653, -1932982173,

第6番目の値は負で印刷されていますが、未署名の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);以下

私のコードは、 10進整数を符号付きプリントアウト。

あなたが欲しい:printf("%u\n", r);

また、rintないunsigned intとして宣言されています。

+0

'r'の宣言も間違っています。 – Barmar

+0

@Barmar trueですが、printfはそれを同じ方法で解釈します。 –

+0

素晴らしい今、それは感謝のトン!!! – Steven

1

タイプrは、intです。 intの32ビットの範囲は、-2147483648= -(2^32)/22147483647 = (2^32)/2 -1の小数です。

2356985123は、符号付きintの範囲外です。 rprintf("%d\n", r);rで印刷すると、-1937982173と表示されます。 -1937982173 = 2356985123 - 2^32

関連する問題