关于printf格式控制符的问题
代码如下:#include <stdio.h>void main()
{
int a,b,c,d;
long long sum;
while(scanf("%d %d %d %d",&a,&b,&c,&d),a!=0||b!=0||c!=0||d!=0){
sum=a+b-c*d;
printf("%lld\n",sum);//long long 类型用%lld
printf("%lld\n",(long long)a+b-c*d);//long long 类型用%lld
printf("%lld\n",a+b-c*d);//int 类型用%lld
}
}
请问各位为什么当输出值为负数时,第三行代码会输出错误的值?仅仅是因为控制符不匹配吗?那为什么值为正值时就正常呢?
注:作业代码,当输入1 2 3 4时输出值为负,输入4 3 2 1时输出值为正
题目如下:
输入描述
有多组输入, 每组输入占一行.
每行仅含四个整数A, B, C, D (-10^9 ≤ A, B, C, D ≤ 10^9).
0 0 0 0代表输入结束, 你不应该处理它.
输出描述
对于每组数据, 输出A+B-C*D.
输出值为负数 ?
第三行代码 ?
你指的是这句 ?
while(scanf("%d %d %d %d",&a,&b,&c,&d),a!=0||b!=0||c!=0||d!=0){
纠正一下,这是第6行
第6行有输出值吗?你指的是输入值?
你是如何输入的?
本帖最后由 风扫地 于 2019-6-19 18:21 编辑
严重性 代码 说明 项目 文件 行 禁止显示状态
警告 C4477 “printf”: 格式字符串“%lld”需要类型“__int64”的参数,但可变参数 1 拥有了类型“int” ConsoleApplication1 c:\users\veepoo\desktop\414_第三大的数\consoleapplication1\consoleapplication1\main.c 10
请考虑在格式字符串中使用“%I32d”
是不匹配造成的。
sum 本身就是lld匹配
(long long)a+b-c*d a被强转为ll,计算结果向更长数据类型进行扩展,得到的结果是ll
a+b-c*d计算结果为int
-------------------------------
输入1 2 3 4
得到结果: -9 -9 4294967287
很显然,格式控制符不一样,取的数据长度不一样,传进去
我看了一下4294967287对应的16进制数是 0xFFFFFFF7
而0xFFF7恰好是-9,
32位的-9传入进去给了一个int64的数。
指定了lld就会取64位数据。
我只能解释到这里了。。
人造人 发表于 2019-6-19 18:07
输出值为负数 ?
第三行代码 ?
你指的是这句 ?
不好意思,是我没说清楚,我指的是第三行printf代码 风扫地 发表于 2019-6-19 18:11
严重性 代码 说明 项目 文件 行 禁止显示状态
警告 C4477 “printf”: 格式字符串“%lld”需要类型“__int ...
我明白了,非常感谢您 为什么高32位都是ffff了。。。这个我就搞不清楚了。。。 风扫地 发表于 2019-6-19 18:24
为什么高32位都是ffff了。。。这个我就搞不清楚了。。。
人造人 发表于 2019-6-19 18:44
看了下低32位是-9,高32位的内容可能得看命了,访问到了不受控的内存。 风扫地 发表于 2019-6-19 18:46
看了下低32位是-9,高32位的内容可能得看命了,访问到了不受控的内存。
嗯 风扫地 发表于 2019-6-19 18:46
看了下低32位是-9,高32位的内容可能得看命了,访问到了不受控的内存。
是不是因为补码负数按位取反的原因,因为负数前面全部补1正数补0,所以导致负数不对而正数不影响 稽20疯会 发表于 2019-6-24 09:39
是不是因为补码负数按位取反的原因,因为负数前面全部补1正数补0,所以导致负数不对而正数不影响
限于个人水平,无法表示看法。。
页:
[1]