首页 > 代码库 > C语言有符号加减溢出
C语言有符号加减溢出
sizeof(short int ) = 2;
测试用例
#include <stdio.h> int main() { short int a = -32768; short int b = 0x8000; short int c = 0xffff; short int d = 0x8001; printf("%d, %d, %d, %d\n", a, b, c, d); a -= 1; b -= 1; c -= 1; d -= 1; printf("%d, %d, %d, %d\n", a, b, c, d); return 0; }结果:
b, c, d的表示均为16进制表示,即机器的存储形式, 补码表示
负数溢出计算
理解一:(按机器存储来看,存储均为补码形式)
a 的补码形式(存储形式)为 1000 0000 ... 0000 a-1机器存储为 01111...1 为 32767的补码
理解二:(如下图)
a为最大负数, a -1 = a+ 2^32 - 1 = -32768 + 65536 -1 = 32767
图 一
另
b: 0xffff 为 -1的补码形式
补充:
short int 最大正数为 32767
测试 37267 + 1 = 01111...1 +1 = 100...0 (为 -32768的补码)
所以
short int a = 32767;
a += 1;
printf("%d\n", a); // -32768 从 图 一 同样可以看出
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。