2020-11-23 <typeinfo> 类型提升

继上篇模运算出现的错误,发现自己对类型提升有些误解。 似乎类型提升并没有想象中那么“人性化”或者说intuitive。

真正的顺序是(char,short)→int→unsigned int →long → double ←float,也就是说最高级的是double,其中需要注意的是int反而没有unsigned int高级。

也就是说当把一个负数与某无符号整数相加的时候,其结果是一个无符号整数。

所以当碰到一个负数加上无符号,值本身就大于0到没什么(也可能直接overflow了),但是值若小于0就会变成某巨大整数了(也算overflow吧,毕竟underflow特指float)。

出问题的地方不知道会是哪里,一般不是用int就是用longlong,关键是在vector等类似容器中,数组下标返回的是个size_t,这玩意儿是个unsigned int,就比较坑,需要注意其参与所有可能含有负值的运算。

类似旋转数组的时候下标取余可能会碰到,另外设置哨兵时也要注意不能让他越界,要不然编译器可能会报错。

另外发现了非常好用的typeinfo头文件,不过输出有点奇怪
可见
https://blog.csdn.net/chenyiming_1990/article/details/8979260

测试用代码
输出j代表是 unsigned int

#include <iostream>
#include <typeinfo>
using namespace std;

int main() {
    int a = -200;
    unsigned b = 130;
    cout << typeid(a%b).name() << endl;
    cout << a%b << endl;
    cout << typeid(b + a).name() << endl;
    cout << b + a << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值