我正在创建一个家庭作业程序,目的是试图教会我们工会在概念上是如何工作的。我相信我理解这个概念,但是我的其中一项输出遇到了困难。长双倍十六进制。
我假设任何长时间打印时,百分号后都需要大写L。例如,打印长双浮点数:
printf(“ \ nLong double:%Lf \ n”,value.ld);
类似地,如果我想以十六进制打印Long Double浮点数,我将使用:
printf(“ \ nLong double:%Lx”,value.ld);
我的教授的输出如下:
Professors Output 长双倍22fde0
我的输出如下:
My Output 长双62fe40
差异在于十六进制的Long Double打印值。这是一个可能因计算机而异的值吗?还是我在思考时犯了一个错误。
我的代码
#include <stdio.h>
// define union data
union data {
float f;
double d;
long double ld;
}value; //union variable
// begin main function
int main(void){
// get initial user input
printf("Enter data for type float: ");
scanf(" %f", &value.f);
puts("\nBreakdown of the element in the union: ");
printf("Float: %f", value.f);
printf("\nDouble: %f", value.d);
printf("\nLong double: %Lf\n", value.ld);
puts("\nBreakdown in hex: ");
printf("Float: %x", value.f);
printf("\nDouble: %x", value.d);
printf("\nLong double: %Lx", value.ld);
// get user input
printf("\n\nEnter data for type double: ");
scanf(" %lf", &value.d);
puts("\nBreakdown of the element in the union: ");
printf("Float: %f", value.f);
printf("\nDouble: %f", value.d);
printf("\nLong double: %Lf\n", value.ld);
puts("\nBreakdown in hex: ");
printf("Float: %x", value.f);
printf("\nDouble: %x", value.d);
printf("\nLong double: %Lx", value.ld);
// get user input
printf("\n\nEnter data for type long double: ");
scanf(" %lf", &value.ld);
puts("\nBreakdown of the element in the union: ");
printf("Float: %f", value.f);
printf("\nDouble: %f", value.d);
printf("\nLong double: %Lf\n", value.ld);
puts("\nBreakdown in hex: ");
printf("Float: %x", value.f);
printf("\nDouble: %x", value.d);
printf("\nLong double: %Lx", value.ld);
return 0;
} // end main function
答案 0 :(得分:1)
react-data-grid
格式说明符期望整数类型以十六进制打印。为此传递浮点类型会调用未定义的行为。
您可以使用%x
格式说明符以十六进制打印浮点数:
%a
答案 1 :(得分:1)
这是一个可能因计算机而异的值
当然。尚不清楚您的教授所说的“十六进制的长倍”是什么意思。如果您这样做了,将long double
传递给%x
说明符,那么您将获得未定义的行为-%x
说明符期望一个整数(或变体),并且不容易预测如果将其传递给float(或变体)会发生什么情况。
如果使用%a
指示符,该指示符明确地用于以十六进制打印浮点数,那么您将得到浮点值的十六进制表示,而不是内存的内容。因此,例如1.5
将被打印为0x1.8p+0
,因为.8
对于十六进制.5
是十六进制的。
如果您真正想要的是内存的内容(十六进制),那么您需要向%x
说明符传递一个整数。最简单的方法是将适当的整数类型添加到联合中。
union data {
float f;
int i;
double d;
long int li;
long double ld;
long long int lli;
}value; //union variable
然后,例如,如果要将内存内容加倍为十六进制,请使用:
// get user input
printf("\n\nEnter data for type double: ");
scanf(" %f", &value.d);
puts("\nBreakdown of the element in the union: ");
printf("Double: %f", value.d);
printf("Hex: %lx", value.li);
顺便说一下,%l...
(小写字母ell)用于整数,%L...
(大写字母ell)用于浮点类型。 long int
的大小通常与64位平台上的double
相同(但不能保证一定是这样!)。 %f
有点让人困惑,是用于double
的论点。没有float
s的说明符-它们会自动提升为double
s。
答案 2 :(得分:0)
请按照how to print float in hex format in C?的指示使用union
这是我从链接中获取的内容:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <math.h>
int main (void) {
float pi = (float)M_PI;
union {
float f;
uint32_t u;
} f2u = { .f = pi };
printf ("pi (floating point): %f\n", pi);
printf ("pi (hex representation): 0x%\n", f2u.u);
return 0;
}
输出:
$ ./bin/float_hex
pi (floating point) : 3.141593
pi (hex representation): 0x40490fdb