C编程将浮点数打印为十六进制的两倍长

时间:2018-11-03 16:43:38

标签: c

我正在创建一个家庭作业程序,目的是试图教会我们工会在概念上是如何工作的。我相信我理解这个概念,但是我的其中一项输出遇到了困难。长双倍十六进制。

我假设任何长时间打印时,百分号后都需要大写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

3 个答案:

答案 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