鱼C论坛

 找回密码
 立即注册
查看: 3030|回复: 10

[已解决]关于printf格式控制符的问题

[复制链接]
发表于 2019-6-19 17:44:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下:
#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.

最佳答案
2019-6-19 18:11:07
本帖最后由 风扫地 于 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位数据。

我只能解释到这里了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-19 18:07:01 | 显示全部楼层
输出值为负数 ?
第三行代码 ?
你指的是这句 ?
while(scanf("%d %d %d %d",&a,&b,&c,&d),a!=0||b!=0||c!=0||d!=0){
纠正一下,这是第6行
第6行有输出值吗?你指的是输入值?
你是如何输入的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-19 18:11:07 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风扫地 于 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位数据。

我只能解释到这里了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-6-19 18:20:39 | 显示全部楼层
人造人 发表于 2019-6-19 18:07
输出值为负数 ?
第三行代码 ?
你指的是这句 ?

不好意思,是我没说清楚,我指的是第三行printf代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-19 18:22:36 | 显示全部楼层
风扫地 发表于 2019-6-19 18:11
严重性        代码        说明        项目        文件        行        禁止显示状态
警告        C4477        “printf”: 格式字符串“%lld”需要类型“__int ...

我明白了,非常感谢您
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-19 18:24:15 | 显示全部楼层
为什么高32位都是ffff了。。。这个我就搞不清楚了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-19 18:44:17 | 显示全部楼层
风扫地 发表于 2019-6-19 18:24
为什么高32位都是ffff了。。。这个我就搞不清楚了。。。

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-19 18:46:26 | 显示全部楼层

看了下低32位是-9,高32位的内容可能得看命了,访问到了不受控的内存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-19 18:47:09 | 显示全部楼层
风扫地 发表于 2019-6-19 18:46
看了下低32位是-9,高32位的内容可能得看命了,访问到了不受控的内存。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-24 09:39:57 | 显示全部楼层
风扫地 发表于 2019-6-19 18:46
看了下低32位是-9,高32位的内容可能得看命了,访问到了不受控的内存。

是不是因为补码负数按位取反的原因,因为负数前面全部补1正数补0,所以导致负数不对而正数不影响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-24 10:49:38 | 显示全部楼层
稽20疯会 发表于 2019-6-24 09:39
是不是因为补码负数按位取反的原因,因为负数前面全部补1正数补0,所以导致负数不对而正数不影响

限于个人水平,无法表示看法。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 21:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表