为什么此代码即使在强制转换时也会溢出?

问题描述 投票:0回答:1

我正在准备涉及 C 的考试,但即使在转换变量时我也会遇到变量错误。代码是从教授给我们的PowerPoint中复制的。

我正在浏览编写此程序的选角部分:

#include <stdio.h>

int main()
{
    long i;
    int j = 100000;

    i = (long)j * j;
    printf("%li", i);
}

我不知道为什么,但这仍然给我输出“1410065408”,这当然意味着它是错误的。 我什至尝试转换这两个变量:

    i = (long)j * (long)j;
    printf("%li", i);

我现在不知道如何移动,先感谢您的帮助

c casting integer long-integer
1个回答
0
投票

强制转换仅在

long
恰好是 64 位的情况下保存情况,但通常情况并非如此。

如果是 32 位,则有符号

long
的最大值为 231-1 = 2.147 * 109.
但是 100000 * 100000 = 10 * 109 所以无论转换如何,我们都会得到整数溢出。

解决方案是使用

int64_t
的便携式
stdint.h
代替:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h> // for printing stdint.h types

int main()
{
    int64_t i;
    int j = 100000;

    i = (int64_t)j * j;
    printf("%" PRIi64, i);
}
© www.soinside.com 2019 - 2024. All rights reserved.