首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cast签名到窄签名

Cast签名到窄签名
EN

Stack Overflow用户
提问于 2018-11-27 09:43:01
回答 3查看 168关注 0票数 1

如果目标类型有符号,则如果源整数可以在目标类型中表示,则值不会更改。

如果我理解得很好,是否可以保证:

代码语言:javascript
复制
static_cast<std::int8_t>(static_cast<std::int16_t>(-3)) == -3

因为-3可以用std::int8_t表示。

因此,在两个补语的例子中:

然后,在二补函数的例子中,我是否需要将中间角色转换为std::uintmax_t?

代码语言:javascript
复制
#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)));
}

因为

代码语言:javascript
复制
return static_cast<T>(-static_cast<U>(val));

如果T比int窄,一元减号前的积分提升会“破坏向无符号类型转换的效果”吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-27 09:54:31

你为什么不像这样得到两个人的补充:

代码语言:javascript
复制
uint32_t num = 10;
uint32_t cmp = ~num + 1; // this is two's complement of 10.

这对你不管用吗?

编辑:如果您担心会发生溢出(无论是签名的还是未签名的),只需先这样做:

代码语言:javascript
复制
if(~num == std::numeric_limits<MyIntType>::max()) {
    // overflow mitigation
}

您还可以静态地检查您的类型是有符号的还是无符号的,以适当的方式缓解std::is_signedstd::is_unsigned的溢出问题。

票数 4
EN

Stack Overflow用户

发布于 2018-11-27 10:03:13

签名/无符号表示与平台有关。即使大多数现代平台使用这两种补码来表示有符号数字,你也不能做这个假设。使用static_cast来执行两个补语并不是正确的方法。如果您想自己进行位操作,请使用固定大小的无符号类型,如量子物理学家的回答(但请再次注意,在加法溢出的情况下发生的情况与平台有关)。

票数 2
EN

Stack Overflow用户

发布于 2018-11-27 09:57:21

调整您与C++强制转换链接的代码:

代码语言:javascript
复制
#include <cstdint>

template <typename T>
T twos_complement(T val)
{
    return static_cast<T>(-static_cast<uintmax_t>(val));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53496737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档