C/C++显示类型转换的位拓展方式
最近用verilator写模块的tb,在这里卡了好久(测半天都是C++写的问题)
要点
变量从小位宽到大位宽显示类型转换(explicit cast)时的位拓展方式,取决于转换前变量的符号性。
倘若转换前为无符号,则拓展为无符号拓展;反之则为有符号拓展。至于转换后的类型,是用来标记拓展后新值符号性用的,不决定拓展方式。
其实和verilog/systemverilog一致(有些忘了,记得有很多规则)。算是仅取决于RHS的情况
案例
uint32_t a = 0x83c60ce1;
printf("0x%016llx\n", a); // 输出 0x0000000083c60ce1
printf("0x%016llx\n", (int64_t)a); // 输出 0x0000000083c60ce1; (uint64_t也一样)
int32_t a = 0x83c60ce1;
printf("0x%016llx\n", a); // 输出 0x0000000083c60ce1
printf("0x%016llx\n", (int64_t)a); // 输出 0xffffffff83c60ce1; (uint64_t也一样)