【问题标题】:Storing 2^31 in an `int`将 2^31 存储在“int”中
【发布时间】:2022-07-12 00:00:01
【问题描述】:

查看thisthis 等链接,我知道C++ 中的unsigned int 应该是16 位的。因此,它可以存储的最大值应该是32767

一个。为什么我们可以将INT_MAX存储在一个int变量中,比如:

int res=INT_MAX;

b.计算2 的幂的代码like below 如何有效(运行时没有任何错误/警告):

class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n>0 && (!(n&n-1));
    }
};

因为约束说:-2^31 <= n <= 2^31 - 1,我们不应该使用long吗?

【问题讨论】:

  • 通过查看您链接的页面,我无法得出 c++ unsigned int 必须为 16 位的结论。该标准要求它具有至少 16 位。
  • @JakobStark,哦,所以上面的代码 sn-ps 都是平台相关的?
  • 对于大多数平台unsigned int 有 32 位 (Windows/Linux/MacOS/iOS/Android/...)。例如在 Arduino 上它是 16 位。
  • 请向下翻页到 PropertiesFundamental types signed int 至少 16。然后使用 static_assert(sizeof(unsigned int) == 16); 检查您的编译器
  • int(以及更多基本类型)的大小取决于您正在编译的平台。如果您需要特定宽度,请使用 std::int16_t 或等效项

标签: c++ algorithm binary bit


【解决方案1】:

一个。为什么我们可以将INT_MAX存储在一个int变量中,比如:

int res=INT_MAX;

INT_MAXint 中可以存储的最大值。根据可以存储在int 中的定义。

b.下面的代码如何计算 2 的幂次有效(运行时没有任何错误/警告): ...

因为约束说:-2^31

约束是错误的。首先,他们假设 int 是 32 位的,例如,情况并非如此。 AVR。其次,他们假设 int 是二进制补码,这仅在 C++20 之后才成立。

更准确地说,约束是INT_MIN <= n <= INT_MAX。但实际上有什么意义。参数是int。已经说了。

最好使用unsigned intuintmax_t 或模板。没有理由将此功能限制为int

自 C++20 起,std::has_single_bit 用于此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2014-11-30
    相关资源
    最近更新 更多