gpt4 book ai didi

c++ - 对 C++ 中的 unsigned short 行为感到困惑

转载 作者:行者123 更新时间:2023-12-01 13:46:40 25 4
gpt4 key购买 nike

我目前正在尝试学习 C++。我通常通过玩弄东西来学习,因为我正在阅读数据类型,然后是声明整数值的方法(十进制、二进制、十六进制等),我决定测试“unsigned short”是如何工作的.我现在很困惑。

这是我的代码:

#include <cstdio> 

int main(){
unsigned short a = 0b0101010101010101;
unsigned short b = 0b01010101010101011;
unsigned short c = 0b010101010101010101;
printf("%hu\n%hu\n%hu\n", a, b, c);
}

“unsigned short”类型的整数在所有操作系统中都应具有 2 个字节的大小。我已经使用二进制来声明这些整数的值,因为这是让我的困惑来源显而易见的最简单方法。

整数“a”在二进制中有 16 位。数据类型中的 16 位数字,大小为 16 位(2 字节)。当我打印它时,我得到的数字是 21845。看起来没问题。 checkout 。

然后它变得很奇怪。

整数“b”有17 位。当我们打印它时,我们得到了 17 位整数 的十进制版本,43691。一个占用 17 位的二进制数如何适合一个变量,该变量应该只有分配给它的16 位内存吗?有人在撒谎吗?这是某种编译器魔法吗?

然后它变得更奇怪。整数“c”有18 位数,但这里我们达到了上限。当我们构建时,我们得到以下错误:

/home/dimitrije/workarea/c++/helloworld.cpp: In function ‘int main()’:
/home/dimitrije/workarea/c++/helloworld.cpp:6:22: warning: large integer implicitly truncated to unsigned type [-Woverflow]
unsigned short c = 0b010101010101010101;

好的,所以我们可以将 17 位数字放入 16 位,但不能放入 18 位。我想这有什么意义吗?就像我们可以用魔法去掉 1 个数字,但两个数字不起作用。但是所谓的“截断”,而不是截断到实际的最大值,17 位数字(或本例中的 43691),而是截断到逻辑上应该的限制,21845。

这让我的大脑炸裂了,我现在已经完全陷入了困境,无法停下来。有谁明白为什么 C++ 会这样?

---编辑---

所以当有人向我指出我的二进制数以 0 开头时,我才意识到自己很愚蠢。

然而,当我从左边取出 0 并向右进位(意味着 a、b c 实际上分别是 16、17、18 位)时,我意识到截断行为仍然没有意义。这是输出:

436902184643690

43960 是 16 位的最大值。我本可以在问最初的问题之前检查一下,这样可以节省一些时间。

为什么 17 位截断为 15,而 18(还有 19、20、21)截断为 16?

--编辑 2---

我已将整数中的所有数字更改为 1,现在我的错误是有道理的。我返回 65535。这次我花时间在计算器中输入 2^16。我的全部问题都是因为我没有正确查看我分配的二进制值。

感谢链接 implicit conversions 的人,我会仔细阅读。

最佳答案

在大多数系统上,无符号短整型是 16 位。无论您将什么分配给 unsigned short,它都将被截断为 16 位。在您的示例中,第一位是 0,它实际上被忽略了,同样 int x = 05; 将只等于 5 而不是 05。

如果您将第一位从 0 更改为 1,您将看到预期的赋值行为将值截断为 16 位。

unsigned short int(16 位)的范围是 0 到 65535

65535 = 1111 1111 1111 1111 二进制

关于c++ - 对 C++ 中的 unsigned short 行为感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60573585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com