溢出现象与原码

1.原码 补码 反码

在这里插入图片描述

位(bit)是计算机中处理数据的最小单位,其取值只能是 0 或 1。

字节(Byte)是计算机处理数据的基本单位,通常系统中一个字节为 8 位。即:1 Byte=8 bit。

为便于演示,本节表示的原码、反码及补码均默认为 8 位。

准确地说,数据在计算机中是以其补码形式存储和运算的。在介绍补码之前,先了解原码和反码的概念。

正数的原码、反码、补码均相同。

原码:用最高位表示符号位,其余位表示数值位的编码称为原码。其中,正数的符号位为 0,负数的符号位为 1。

负数的反码:把原码的符号位保持不变,数值位逐位取反,即可得原码的反码。

负数的补码:在反码的基础上加 1 即得该原码的补码。

例如:
+11 的原码为: 0000 1011
+11 的反码为: 0000 1011
+11 的补码为: 0000 1011

-7 的原码为:1000 0111
-7 的反码为:1111 1000
-7 的补码为:1111 1001

注意,对补码再求一次补码操作就可得该补码对应的原码。

2.整数溢出原理

整数溢出其实是利用了整数存在上限的问题。比如一个USHORT类型的数据,他的上限就是65535,当你给他输入65536时就会溢出,此时就变成了0。而我们一般做字符串长度校验时,通常都是

char des[11] = { 0 };

if(strlen(str) > 10) 
{
    printf("对不起输入的str长度过长,无法复制\n");
    return 0;
}
strcpy(des, str);

那么此时的str字符串如果是一个超级长的字符串65536时,这个条件由于整数溢出依旧会成立。所以在其下方的strcpy函数就会发生栈溢出。整数溢出的核心就是突破长度检测。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙栩源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值