为什么我手动输入的 double 值与 C 中的预期值不匹配?

问题描述 投票:0回答:1

问题:

作为初学者,我对内存架构以及值如何存储在内存中感到好奇,所以我尝试了这段代码。没有别的了。

我正在尝试使用 C 中的 scanf 手动输入字节值以创建特定的双精度值。但是,生成的双精度值与我的期望不符。这就是我正在做的事情:

首先,工作示例:

该程序打印分配给 double 的 8 个字节中的每个字节值。

#include <stdio.h>

int main() {
    double a = 18446744073709551616.0;
    printf("value=%lf\n", a);
    int i;
    char *b = (char*)&a;
    for (i = 0; i < 8; i++) {
       printf("%d byte (%p)value: <%d>\n", i + 1, b, *b);
       b++;
    }
    return 0;
}

输出:

value=18446744073709551616.000000
1 byte (0x7ffda3f173f8)value: <0>
2 byte (0x7ffda3f173f9)value: <0>
3 byte (0x7ffda3f173fa)value: <0>
4 byte (0x7ffda3f173fb)value: <0>
5 byte (0x7ffda3f173fc)value: <0>
6 byte (0x7ffda3f173fd)value: <0>
7 byte (0x7ffda3f173fe)value: <-16>
8 byte (0x7ffda3f173ff)value: <67>

当您将所有这些值转换为二进制并以小端格式读取它时,这是有意义的,这给了我

的 IEEE-754 标准表示

18446744073709551616.000000 转换为:

1st byte value (0) which in binary -> (00000000)
2nd byte value (0) which in binary -> (00000000)
3rd byte value (0) which in binary -> (00000000)
4th byte value (0) which in binary -> (00000000)
5th byte value (0) which in binary -> (00000000)
6th byte value (0) which in binary -> (00000000)
7th byte value (-16) which in binary -> (11110000)
8th byte value (67) which in binary -> (01000011)

现在,有问题的代码:

我尝试使用 scanf 手动输入该值,代码如下:

#include <stdio.h>

int main() {
    double a;
    int i;
    char *b = (char*)&a;
    for (i = 0; i < 8; i++) {
       printf("Enter %d byte value: ", i + 1);
       scanf("%d", b);
       b++;
    }
    printf("Final value: %lf\n", a);
    return 0;
}

输入:

1字节值:0 2字节值:0 3字节值:0 4字节值:0 5字节值:0 6字节值:0 7字节值:-16 8 字节值:67

输出:

最终值:0.000000

问题:

为什么这段代码没有产生与第一个示例相同的双精度值?如何正确输入字节值以获得相同的双精度值?

c encoding binary double ieee-754
1个回答
0
投票

您使用了错误的格式说明符。为了确保输入被读取为

char
,您需要
%hhd
。具体来说,您的行
scanf("%d", b);
扫描一个整数并存储在
char
类型变量中,从而使行为未定义。回想一下
int
char
具有不同的字节。
char
是 1 个字节,
int
通常是 4 个字节(取决于编译器)

为了完整起见,代码和输出如下所示:

#include <stdio.h>

int main() {
    double a;
    int i;
    char *b = (char*)&a;
    for (i = 0; i < 8; i++) {
       printf("Enter %d byte value: ", i + 1);
       scanf("%hhd", b);
       b++;
    }
    printf("Final value: %lf\n", a);
    return 0;
}

输出:

/tmp/E9Olq2nOoS.o
Enter 1 byte value: 0
Enter 2 byte value: 0
Enter 3 byte value: 0
Enter 4 byte value: 0
Enter 5 byte value: 0
Enter 6 byte value: 0
Enter 7 byte value: -16
Enter 8 byte value: 67
Final value: 18446744073709551616.000000



© www.soinside.com 2019 - 2024. All rights reserved.