c - 具有整数溢出条件的整数的反转

标签 c math

long long  reverse(long long x) {
    long long reversednum=0;
    int sign=1;
    if(x<0)
        sign=-1;
    x=abs(x);

    while(x)
    {
        reversednum=reversednum*10;
        reversednum=reversednum+(x%10);
        x=x/10;
    }

    return (reversednum<INT_MAX || reversednum>INT_MIN)?reversednum*sign:0;
}

除了这个 1534236469 返回输出 1056389759 之外,我的大多数测试用例都得到了满足。我看到了很多建议并将其更改为 long long。但仍然产生相同的结果。希望有人能帮助我。提前致谢!! 假设输入是 32 位有符号整数。当反转的整数溢出时,我的函数应该返回 0

最佳答案

我确信您一定在 printf 中使用 %ld...使用 %lld!简单的错误:)

分析发生的事情:

当你进入 1534236469 结果应该是 9646324351,它是由函数正确生成的(是的!)。

在二进制中, 9646324351 写为 00000010 00111110 11110111 00111010 01111111 。现在,编译器为 long 分配 4 个字节,为 long long 分配 8 个字节。因此,当您打印 long (本来应该是 long long 的地方)时,编译器将简单地从二进制文件中取出前 4 个字节并丢弃其余部分。这意味着您的编译器只需要 00111110 11110111 00111010 01111111 ,相当于十进制的 1056389759 。因此输出...所以这意味着你的函数和逻辑是正确的(phewwww....!!!!)但是你犯了一个愚蠢的错误。

关于c - 具有整数溢出条件的整数的反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44229392/

相关文章:

algorithm - 计算算法复杂度的级数求和

c - 在c中累积数组

c - C 'for' 循环中的多个条件

c - 为什么将 ucontext 添加到 POSIX,然后又从 POSIX 中删除?

javascript - javascript数学方程显示错误答案

javascript - 将数字转换为空间量

c++ - 为什么使用数组会得到不同的结果?

c - 编辑此汇编代码以仅使用加/减/移位

c++ - 如何根据谷歌 Protocol Buffer 的要求定义重复字段?

algorithm - 我需要根据此模式进行数据转换的简单公式