c++ int和unsignedint溢出原理分析

首先,我们要找到int的最大值,在climits头文件中有一个常量是INT_MAX表示int的最大值。

上溢:

/*by kzl*/
#include<iostream>
#include<climits>
using namespace std;

int main(){
    int n_max = INT_MAX;
    unsigned int un_max = n_max;
    cout<<"有符号整数最大值: "<<n_max<<endl;
    cout<<"无符号整数最大值: "<<un_max<<endl;
    cout<<"加一之后"<<endl;
    n_max = n_max + 1;
    un_max = un_max + 1;
    cout<<"有符号整数的值: "<<n_max<<endl;
    cout<<"无符号整数的值: "<<un_max<<endl;
return 0;
}

结果:



向下溢出:

/*by kzl*/
#include<iostream>
#include<climits>
using namespace std;


int main(){
    int n_max = 0;
    unsigned int un_max = 0;
    cout<<"有符号整数的值: "<<n_max<<endl;
    cout<<"无符号整数的值: "<<un_max<<endl;
    cout<<"减一之后"<<endl;
    n_max = n_max - 1;
    un_max = un_max - 1;
    cout<<"有符号整数的值: "<<n_max<<endl;
    cout<<"无符号整数的值: "<<un_max<<endl;
return 0;
}

结果:



向上溢出的原理(默认int是32位的):有符号位的Int第一位是符号位,所以其实际上只能存储31个有效位。当他的后31位全部是1的时候,就是int的最大值。


然后如果在加一,就变成了100000000000...(31个0)第一位符号位是1表示负数,然后后31位为0,表示负数的最小值为-2147483648.如果在加一,则数字为-2147483647.

无符号:因为无符号32位全部是有效位,所以其上限是4294967295,远远大于当前值,所以可以正常的加1.


向下溢出的原理:

无符号:一开始32位全部是0,然后减1,从前面位借位过来,所以32位全部被置为1,所以变成了他的最大值。

有符号:同理,32全部被置为1,但是由于第一位是符号位,所以只有后面31位有效,表示第2147483647小的负数,就是-1.


### 回答1: 有什么区别? unsigned short unsigned short int 是等价的,都表示无符号短整型,它们的取值范围都是 到 65535。在 C 语言中,short short int 也是等价的。 ### 回答2: C的数据类型中,unsigned shortunsigned short int是等价的,都表示无符号短整数。 unsigned表示无符号,也就是没有正负号,只能表示非负整数。short表示短整数,占2个字节(16位),范围为0到65535。 unsigned shortunsigned short int虽然在写法上有差异,但语义上是完全一样的,都表示相同的数据类型。在C语言中,类型名可以省略int关键字,所以unsigned shortunsigned short int是等效的写法。 这两个类型常用于对不需要负数的整数进行存储处理。由于省略了符号位,无符号整数类型可以表示更大的正数范围,但不能用来表示负数或需要进行算术运算的场景。 通过使用unsigned short(int)类型,我们可以节省内存空间,特别是在对大量非负整数进行存储计算时。然而,在使用该类型时需要注意溢出问题,因为它的取值范围有限,当数据超过该范围时可能会导致数据丢失或错误结果。 总的来说,unsigned shortunsigned short int都表示无符号短整数类型,在C语言中可以互换使用,都适用于存储处理不需要负数的非负整数数据。 ### 回答3: c语言中,unsigned short unsigned short int 是相同的数据类型,用来表示无符号的短整数。unsigned short 被广泛使用,unsigned short int 则是对该类型的完整命名。在C语言中,short int int 可以互换使用,因此 unsigned short int 也可以简写为 unsigned short。 unsigned short unsigned short int 可以保存范围在0到65535之间的整数值。其中,unsigned 表示该类型的变量只能保存非负的数值,short 表示该类型的变量占用的内存空间较小,通常为2个字节。因此,unsigned short unsigned short int 可以用来节省内存空间,特别适合用于表示较小的正整数。 由于 unsigned short unsigned short int 并无本质区别,所以在使用时可以视个人习惯来选择使用哪种命名方式。根据C语言的命名规范,一般情况下建议使用 unsigned short,因为它更加简洁明了。但是,在某些特定场景中,也可以使用 unsigned short int 来强调该变量的数据类型,提高代码的可读性。 总之,unsigned short unsigned short int 都是C语言中表示无符号短整数的数据类型,没有实际上的差别,只是在命名上稍有不同。在使用时可以根据个人习惯项目要求选择合适的命名方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值