作为初学者,我对内存架构以及值如何存储在内存中感到好奇,所以我尝试了这段代码。没有别的了。
我正在尝试使用 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
为什么这段代码没有产生与第一个示例相同的双精度值?如何正确输入字节值以获得相同的双精度值?
您使用了错误的格式说明符。为了确保输入被读取为
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