鱼C论坛

 找回密码
 立即注册
查看: 1029|回复: 2

[已解决]整数溢出

[复制链接]
发表于 2018-10-18 16:38:05 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
int main(void)
{
        int i = 2147483647;
        unsigned int j = 4294967295;

        printf("%d %d %d\n", i, i + 1, i + 2);
        printf("%u %u %u\n", j, j + 1, j + 2);

        getchar();
        return 0;
}
我想问下问什么i+1会变成-2147483648而不是变成-2147483647

最佳答案
2018-10-19 09:26:21
本帖最后由 pheron 于 2018-10-19 09:28 编辑

由于计算机不会算减法,只会加法,所以数字在计算机里都直接存储为2进制补码。
举个栗子:假设这是一个8位机。127 = 0111 1111, 那么0111 1111 + 1 = 1000 0000 补码转为原码:首先符号位即第一位不参与运算,其余为取反:1000 0000→1111 1111 ,即-127然后还要+1,即-128。
如果你问我为什么0111 1111 + 1 的时候为什么符号位参与运算,我只能说符号位参与运算是为了做减法运算,符号位参与运算能保证符号的正确性。如果你还要问为什么。。。我也可以再给你放个链接  https://fishc.com.cn/forum.php?mod=viewthread&tid=124184&page=1#pid3596476这里如果还是看不懂的话,建议仔细看看书上对原码反码补码的讲解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-18 16:53:48 | 显示全部楼层
数字在计算机里是以2进制补码存储的,int型的表示范围是-2^31~2^31-1。2147483647表示为0111 1111 1111 1111
1111 1111 1111 1111。最高位的零是符号位,0表示正,1表示负,2147483647+1后就变成了 1000 0000 0000 0000
0000 0000 0000 0000。对应正十进制中的-2147483648。也就是-2^31。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-19 09:26:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 pheron 于 2018-10-19 09:28 编辑

由于计算机不会算减法,只会加法,所以数字在计算机里都直接存储为2进制补码。
举个栗子:假设这是一个8位机。127 = 0111 1111, 那么0111 1111 + 1 = 1000 0000 补码转为原码:首先符号位即第一位不参与运算,其余为取反:1000 0000→1111 1111 ,即-127然后还要+1,即-128。
如果你问我为什么0111 1111 + 1 的时候为什么符号位参与运算,我只能说符号位参与运算是为了做减法运算,符号位参与运算能保证符号的正确性。如果你还要问为什么。。。我也可以再给你放个链接  https://fishc.com.cn/forum.php?mod=viewthread&tid=124184&page=1#pid3596476这里如果还是看不懂的话,建议仔细看看书上对原码反码补码的讲解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 01:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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