所以,这是我的 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 code 和 CLion 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
我找不到任何转换模式。
为
float
传递 double
(在本例中会自动转换为 %c
)具有未定义的行为。 printf
查找您的程序将传递给它的参数(如果其类型为 int
或升级为 int
的较小类型并使用该值)。在您的情况下,该值恰好是 223 或 29,具体取决于具体情况,并且它可能是不同 CPU 上的其他值,或者在程序中进行任何不相关的更改之后,甚至只是在不同的时间或地点......该行为是未定义的,您也可能没有输出或程序崩溃(不太可能但并非不可能)。
使用编译器警告来尝试检测此类问题(gcc -Wall -Wextra -Werror)并避免绞尽脑汁试图理解未定义的行为。