大苏打dd 发表于 2023-2-20 19:32:46

求助

void main()
{
        int a,b=322;
        float x,y=8.88;
        char c1='k',c2;
        a=y;
        x=b;
        a=c1;
        c2=b;
        printf("%d,%f,%d,%c",a,x,a,c2);
}
这个代码怎么出来结果是107,322.000000,107,BPress any key to continue
不是很懂这两个107怎么来的 还有后边的英语也不知道怎么出来的

额外减小 发表于 2023-2-20 19:44:41

我看看

大苏打dd 发表于 2023-2-20 19:46:01

额外减小 发表于 2023-2-20 19:44
我看看

我加了\n 现在答案变成107
,322.000000
,107
,B

额外减小 发表于 2023-2-20 19:47:10

a先被赋值为 y 的值,再被赋值为 c1 的值,所以打印出来的时候应该输出的 a 是 c1 的值,由于打印的占位符是 "%d" 所以打印 c1='k' 的ASCII码,也就是107

额外减小 发表于 2023-2-20 19:48:34

大苏打dd 发表于 2023-2-20 19:49:07

额外减小 发表于 2023-2-20 19:47
a先被赋值为 y 的值,再被赋值为 c1 的值,所以打印出来的时候应该输出的 a 是 c1 的值,由于打印的占位符 ...

c2的值是怎么成B的

额外减小 发表于 2023-2-20 19:51:09

程序实际输出的结果是:
107,322.000000,107,B
后面那个
Press any key to continue
是DEV-C++的调试结果。告诉你说这个程序结束了
用stdlib里面的system("pause")有相同效果

liuhongrun2022 发表于 2023-2-20 19:53:17

本帖最后由 liuhongrun2022 于 2023-2-20 19:54 编辑

大苏打dd 发表于 2023-2-20 19:49
c2的值是怎么成B的

char字符占 8bit 的空间,表达范围是 0~255,你赋的值 322 已超出其可表达的范围,高位部分会被截断抛弃。
如322,其二进制为0000 0001 0100 0010(用十六进制来表达即 0x142 ),因为只能存放 8bit 的数据,故而变量 c2 实际存放的仅是322的低8位,即 0100 0010 (用十六进制来表达即 0x42 ),用十进制来表达即是 66 ,对应 ASCII 码正好是字符'B'

额外减小 发表于 2023-2-20 19:53:31

大苏打dd 发表于 2023-2-20 19:49
c2的值是怎么成B的

你把 char 类型的 c2 赋值为 b=322 嘛,因为 char 类型尺寸为1字节,存放不了 322这么大的数字,所以溢出了(相当于减掉256)所以c2 就变成66,即'B'的ASCII码

大苏打dd 发表于 2023-2-20 19:53:57

额外减小 发表于 2023-2-20 19:51
程序实际输出的结果是:
107,322.000000,107,B
后面那个


有点不理解那个B,c2=b 之后c2不是322吗

额外减小 发表于 2023-2-20 19:55:02

大苏打dd 发表于 2023-2-20 19:53
有点不理解那个B,c2=b 之后c2不是322吗

溢出了。因为c2是char类型,不能存放322.具体我觉的liuhongrun说的更清楚

大苏打dd 发表于 2023-2-20 19:55:11

额外减小 发表于 2023-2-20 19:53
你把 char 类型的 c2 赋值为 b=322 嘛,因为 char 类型尺寸为1字节,存放不了 322这么大的数字,所以溢出 ...

原来如此 谢谢你

liuhongrun2022 发表于 2023-2-20 19:55:24

大苏打dd 发表于 2023-2-20 19:53
有点不理解那个B,c2=b 之后c2不是322吗

%c 会把数字识别成ASCII码的

额外减小 发表于 2023-2-20 19:56:09

大苏打dd 发表于 2023-2-20 19:55
原来如此 谢谢你

不用谢。我觉得最佳应该给蓝色的这位(
页: [1]
查看完整版本: 求助