c ++不一致的无符号到有符号减法结果仅对一种排列失败

问题描述

我意识到有一个规则,可以将宽度小于 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 (将#修改为@)