为什么 printf("%c", 0.21) 结果是 'ß'?

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

所以,这是我的 C 代码。当我为了学习格式说明符而摆弄我的代码时,尤其是

%c

#include <stdio.h>

void main()
{
    double a = 0.21;
    printf("%c", a);
}

我碰巧遇到,即使我在

printf()
函数中为格式说明符
%c
传递一个浮点值作为参数,编译器(我的编译器是 gcc)也会以某种方式将值
0.21
转换为十进制值
 223
对应 ASCII 字符
ß

对于

a = 0.22
,输出为:
)
,其 ASCII 表中的十进制值为
29

我在 VS codeCLion IDE 上运行了代码,但结果是相同的。现在它让我摸不着头脑好几天了,我无法弄清楚。

我想知道值

0.21
0.22
如何转换为十进制
223
29
,或者它们如何分别对应于ASCII 223和29,即
ß
)

任何帮助将不胜感激。

由于值 0.21、0.22 不对应于任何 ASCII,所以我希望程序不会打印任何内容。

但根据输出,我认为这可能与二进制文件有关。
因为二进制的 0.21 是 0.00110101110000101000111101011100...
& 223 是 11011111
二进制的 0.22 是 0.00111000010100011110101110000101...
& 29 是 00011101

我找不到任何转换模式。

c printf format-specifiers
1个回答
0
投票

float
传递
double
(在本例中会自动转换为
%c
)具有未定义的行为。
printf
查找您的程序将传递给它的参数(如果其类型为
int
或升级为
int
的较小类型并使用该值)。在您的情况下,该值恰好是 223 或 29,具体取决于具体情况,并且它可能是不同 CPU 上的其他值,或者在程序中进行任何不相关的更改之后,甚至只是在不同的时间或地点......该行为是未定义的,您也可能没有输出或程序崩溃(不太可能但并非不可能)。

使用编译器警告来尝试检测此类问题(gcc -Wall -Wextra -Werror)并避免绞尽脑汁试图理解未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.