继上篇模运算出现的错误,发现自己对类型提升有些误解。 似乎类型提升并没有想象中那么“人性化”或者说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;
}