【问题标题】:Reading binary values in c在c中读取二进制值
【发布时间】:2017-12-10 12:35:25
【问题描述】:

我可以从二进制文件中读取无符号整数,但其中一个值打印为负数。

预期值:

45788331, 281302247, 461354227, 13127, 299215653, 2356985123,

打印出来的值:

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

第 6 个值打印为负数,但我正在读取无符号整数列表?

下面是我的代码

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

【问题讨论】:

  • 你使用什么字节对齐方式?
  • 您已将 r 声明为已签名,而不是未签名。

标签: c binary


【解决方案1】:

printf("%d\n", r); 打印出一个有符号十进制整数。

你想要:printf("%u\n", r);

此外,r 被声明为 int 而不是 unsigned int

【讨论】:

  • @Barmar 是真的,但 printf 会以同样的方式解释它。
  • 为格式化选项传递错误类型的变量不是未定义的行为吗?
  • @Barmar,我想是的,所以不应该依赖它们的行为相同,但在这种情况下,真正的问题是格式字符串,而不是类型.
【解决方案2】:

r 的类型是 int。 32 位 int 的范围是 -2147483648 = -(2^32)/22147483647 = (2^32)/2 -1 十进制。

2356985123 超出了签名int 的范围。当通过printf("%d\n", r); 打印r 时,r 将显示为-1937982173-1937982173 = 2356985123 - 2^32

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2012-07-08
    • 1970-01-01
    相关资源
    最近更新 更多