int型相加后输出用%lld为什么出错

P1001 A+B Problem

_chiyu_1236_ @ 2024-11-03 18:15:37

某人某年某月因无聊刷水题

它告诉我范围在int内

深思一下子后

#include <cstdio>
using namespace std;
int a,b;
int main(){
    scanf("%d%d",&a,&b);
    printf("%lld",a+b);
    return 0;
}

看了一眼,自我感觉十分满意

懒得运行一遍

最后

我:?

下滑查看题目提供的代码

思考

非得用cin/cout?

好消息过了

坏消息没搞懂

继续实验

后来发现

#include <cstdio>
long long a,b;
int main(){
    scanf("%lld%lld",&a,&b);
    printf("%lld\n",a+b);
    return 0;
}

或者

#include <cstdio>
int a,b;
int main(){
    scanf("%d%d",&a,&b);
    printf("%d\n",a+b);
    return 0;
}

都AC了

所以两个int型相加后输出用%lld为什么出错


by SuperAlex4 @ 2024-11-03 18:17:45

%lld 是 long long 的格式,比 int 长,所以会把 int 的符号位当成正常位输出


by 水星湖 @ 2024-11-03 18:19:53

@_chiyu1236 因为int类型使用%d,longlong使用%lld,int用%lld为什么不出错?


by Enthon_Yuan @ 2024-11-03 18:24:01

一楼正解

试试这个

printf("%lld",(int)-1);

by KarmaticEnding @ 2024-11-03 18:27:11

@_chiyu1236

这就不得不拿出这张图片了

输出的是 4294967295

-1\texttt{int} 表示中,其表示为 321,其中第一个 1 是符号位,也就是一个符号为负且后 31 位都为 1\texttt{int} 类型。但是如果用 \texttt{\%lld} 输出这玩意,那么系统就会认为这是一个符号为正,二进制前 31 位为 032 位为 1\texttt{long long} 类型,计算一番后输出 4294967295 了。


by _chiyu_1236_ @ 2024-11-03 18:47:28

@light_dream 谢谢


by _chiyu_1236_ @ 2024-11-03 18:47:41

@Enthon_Yuan ok


by _chiyu_1236_ @ 2024-11-03 18:48:25

@水星湖 主要想着强制转换一下,不过现在有答案了,负数还不能这么转


by _chiyu_1236_ @ 2024-11-03 18:48:48

@SuperAlex4 谢谢


|