使用 %d 打印浮点值并查看其二进制缓冲区

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

我正在自定义硬件上编写一些 C/C++ 代码,但它无法使用

%f
打印浮点数,这是由于它不支持 uart ftdi。

因此,我编写了一个代码,使用

%d
打印浮点值,并使用指针打印其缓冲区内存。

代码:

#include <stdio.h>

int main()
{
   float a = 6.7;
   
   printf("float a = %f\n", a);
   
   unsigned int a_int = *(int*)&a;
   printf("intbufa = %d\n", a_int);
   
   printf("hex   a = 0x%x\n", a);
   
   printf("int   a = %d\n", a);
   
   int comp_1s = ~a_int;
   printf("comp_1s = %d\n", comp_1s);
   
   int comp_2s = ~a_int + 1;
   printf("comp_2s = %d\n", comp_2s);

}

输出看起来像

float a = 6.700000
intbufa = 1087792742
hex   a = 0xc0000000
int   a = -1073741824
comp_1s = -1087792743
comp_2s = -1087792742

我没有理解的是 int a 打印,我记得它与 2 的补码有关 谁能解释一下吗?

c printf bit
1个回答
0
投票

unsigned int a_int = *(int*)&a;
调用未定义的行为。必须以不同的方式完成。

我没有理解的是 int a print,我记得它有 与2的补码有关如果有人能解释一下吗?

是的,和脚趾的赞美有关。如果二进制表示确实表示负数,则

%d
将打印负数。

基本上,所有具有最高有效位设置的数字在用作有符号整数时都是负数。

signed char ch = 0x80;

printf("%hhd\n", ch);

将打印

-128

  • signed char ch = 0x81;printf("%hhd\n", ch);
    - 将打印
    -127
  • signed char ch = 0x82;printf("%hhd\n", ch);
    - 将打印
    -126

...

  • signed char ch = 0xff;printf("%hhd\n", ch);
    - 将打印
    -1
© www.soinside.com 2019 - 2024. All rights reserved.