数据类型的溢出

1. 如何自己计算得到边界值


注:整数常量的数据类型默认为:能表示该数的最小数据类型。
以下从小到大排列,选择表中能够表示该整数常量的第一个数据类型(如 8 选 int,2^32+10 选 long int)
- 10进制常量可选:int, long int, long long int
- 8进制或16进制常量可选:int, unsigned int,long int,unsigned long int, long long int,unsigned long long int)

// 计算数据类型的边界:最小值和最大值
//
#include <iostream>
using namespace std;
int main()
{
    //计算无符号整型
    unsigned int uint_max, uint_min;
    uint_max = ~(unsigned)0;//按位取反
    uint_min = 0;
    cout <<"uint_max = " << uint_max << endl;
    cout <<"uint_min = " << uint_min << endl;
    //计算有符号整型
    int int_max, int_min;
    int_max = (~(unsigned)0 >> 1) ;
    int_min = -int_max - 1;
    cout <<"int_max = "<< int_max << endl;
    cout <<"int_min = "<< int_min << endl;
}

2. C/C++库文件的数据类型边界

在C语言中的各数据类型的边界如下:
包含在头文件#include <limits.h>
c++包含在#include <limits> – 引用的是limits.h的内容

//limits.h
#define MB_LEN_MAX    5             /* max. # bytes in multibyte char */
#define SHRT_MIN    (-32768)        /* minimum (signed) short value */
#define SHRT_MAX      32767         /* maximum (signed) short value */
#define USHRT_MAX     0xffff        /* maximum unsigned short value */
#define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value */
#define INT_MAX       2147483647    /* maximum (signed) int value */
#define UINT_MAX      0xffffffff    /* maximum unsigned int value */
#define LONG_MIN    (-2147483647L - 1) /* minimum (signed) long value */
#define LONG_MAX      2147483647L   /* maximum (signed) long value */
#define ULONG_MAX     0xffffffffUL  /* maximum unsigned long value */
#define LLONG_MAX     9223372036854775807i64       /* maximum signed long long int value */
#define LLONG_MIN   (-9223372036854775807i64 - 1)  /* minimum signed long long int value */
#define ULLONG_MAX    0xffffffffffffffffui64       /* maximum unsigned long long int value */

3. 如何判读溢出

参考传送门:
C语言的整型溢出问题:http://www.kuqin.com/shuoit/20140421/339376.html

#include <limits.h>
//有符号整型的判断溢出
void f(signed int si_a, signed int si_b) {
    signed int sum;

    /* Handle error */
    if (((si_b > 0) && (si_a > (INT_MAX - si_b))) ||
        ((si_b < 0) && (si_a < (INT_MIN - si_b)))) {

        return;
    }

    sum = si_a + si_b;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值