问题描述
我意识到有一个规则,可以将宽度小于 int
的数字提升为更宽的类型以进行加法运算。但我无法完全解释如何只有以下 print_unsafe_minus
的一种排列会失败。为什么只有 <unsigned,long>
示例失败?对于程序员来说,最佳实践有什么收获?
#include <fmt/core.h>
template<typename M,typename N>
void print_unsafe_minus() {
M a = 3,b = 4;
N c = a - b;
fmt::print("{}\n",c);
}
int main() {
// storing result of unsigned 3 minus 4 to a signed type
print_unsafe_minus<uint8_t,int8_t>(); // -1
print_unsafe_minus<uint16_t,int8_t>(); // -1
print_unsafe_minus<uint32_t,int8_t>(); // -1
print_unsafe_minus<uint64_t,int8_t>(); // -1
print_unsafe_minus<uint8_t,int16_t>(); // -1
print_unsafe_minus<uint16_t,int16_t>(); // -1
print_unsafe_minus<uint32_t,int16_t>(); // -1
print_unsafe_minus<uint64_t,int16_t>(); // -1
print_unsafe_minus<uint8_t,int32_t>(); // -1
print_unsafe_minus<uint16_t,int32_t>(); // -1
print_unsafe_minus<uint32_t,int32_t>(); // -1
print_unsafe_minus<uint64_t,int32_t>(); // -1
print_unsafe_minus<uint8_t,int64_t>(); // -1
print_unsafe_minus<uint16_t,int64_t>(); // -1
print_unsafe_minus<uint32_t,int64_t>(); // 4294967295
print_unsafe_minus<uint64_t,int64_t>(); // -1
}
(编辑)另外值得注意的是——如果我们扩展示例以包含 128 位整数,那么以下两个排列也会失败:
print_unsafe_minus<uint32_t,__int128>(); // 4294967295
print_unsafe_minus<uint64_t,__int128>(); // 18446744073709551615
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)