如果目标类型有符号,则如果源整数可以在目标类型中表示,则值不会更改。
如果我理解得很好,是否可以保证:
static_cast<std::int8_t>(static_cast<std::int16_t>(-3)) == -3因为-3可以用std::int8_t表示。
因此,在两个补语的例子中:
然后,在二补函数的例子中,我是否需要将中间角色转换为std::uintmax_t?
#include <type_traits>
template <typename T>
T twos_complement(T val)
{
typedef std::make_unsigned<T>::type U;
return static_cast<T>(-static_cast<uintmax_t>(static_cast<U>(val)));
}因为
return static_cast<T>(-static_cast<U>(val));如果T比int窄,一元减号前的积分提升会“破坏向无符号类型转换的效果”吗?
发布于 2018-11-27 09:54:31
你为什么不像这样得到两个人的补充:
uint32_t num = 10;
uint32_t cmp = ~num + 1; // this is two's complement of 10.这对你不管用吗?
编辑:如果您担心会发生溢出(无论是签名的还是未签名的),只需先这样做:
if(~num == std::numeric_limits<MyIntType>::max()) {
// overflow mitigation
}您还可以静态地检查您的类型是有符号的还是无符号的,以适当的方式缓解std::is_signed和std::is_unsigned的溢出问题。
发布于 2018-11-27 10:03:13
签名/无符号表示与平台有关。即使大多数现代平台使用这两种补码来表示有符号数字,你也不能做这个假设。使用static_cast来执行两个补语并不是正确的方法。如果您想自己进行位操作,请使用固定大小的无符号类型,如量子物理学家的回答(但请再次注意,在加法溢出的情况下发生的情况与平台有关)。
发布于 2018-11-27 09:57:21
调整您与C++强制转换链接的代码:
#include <cstdint>
template <typename T>
T twos_complement(T val)
{
return static_cast<T>(-static_cast<uintmax_t>(val));
}https://stackoverflow.com/questions/53496737
复制相似问题