我正在自定义硬件上编写一些 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 的补码有关 谁能解释一下吗?
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