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.youkuaiyun.com/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;
}

import org.apache.flink.api.common.functions.RichMapFunction; import org.apache.flink.api.common.typeinfo.BasicTypeInfo; import org.apache.flink.api.common.typeinfo.TypeInformation; import org.apache.flink.api.java.io.jdbc.JDBCAppendTableSink; import org.apache.flink.api.java.io.jdbc.JDBCInputFormat; import org.apache.flink.api.java.typeutils.RowTypeInfo; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.types.Row; import java.util.Arrays; public class FlinkDemo { private static String driverClass = "com.mysql.cj.jdbc.Driver"; private static String dbUrl = "jdbc:mysql://localhost:3396/test?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8&serverTimezone=Asia/Shanghai"; private static String userName = "root"; private static String passWord = "123456"; public static void main(String[] args) { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStreamSource<Student> input = env.fromCollection(Arrays.asList(new Student("Tom", 25), new Student("Jack", 24))); DataStream<Row> ds = input.map(new RichMapFunction<Student, Row>() { @Override public Row map(Student student) throws Exception { return Row.of(student.getName(), student.getAge()); } }); TypeInformation<?>[] fieldTypes = new TypeInformation<?>[]{ BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.INT_TYPE_INFO }; RowTypeInfo rowTypeInfo = new RowTypeInfo(fieldTypes); //写入mysql(追加模式) JDBCAppendTableSink sink = JDBCAppendTableSink.builder() .setDrivername(driverClass) .setDBUrl(dbUrl) .setUsername(userName) .setPassword(passWord) .setParameterTypes(fieldTypes) .setQuery("insert into student values(?,?)") .build(); sink.emitDataStream(ds); //查询mysql JDBCInputFormat jdbcInputFormat = JDBCInputFormat.buildJDBCInputFormat() .setDrivername(driverClass) .setDBUrl(dbUrl) .setUsername(userName) .setPassword(passWord) .setQuery("select * from student") .setRowTypeInfo(rowTypeInfo) .finish(); DataStreamSource<Row> input1 = env.createInput(jdbcInputFormat); input1.print(); try { env.execute(); } catch (Exception e) { e.printStackTrace(); } } }
最新发布
03-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值