【发布时间】:2012-01-09 04:16:52
【问题描述】:
我正在尝试将 65529 从 unsigned int 转换为已签名的 int。我试着做这样的演员:
unsigned int x = 65529;
int y = (int) x;
但是y 在应该返回 -7 时仍然返回 65529。这是为什么呢?
【问题讨论】:
-
你可以试试这个:
y=(int)x<<(sizeof(int)*CHAR_BIT-16)>>(sizeof(int)*CHAR_BIT-16);。应该适用于大多数平台。 -
32 位时代已经到来了几十年。如果您仍在为 DOS 或 int 具有 16 位的嵌入式系统使用古老的编译器,那么结果可能与您预期的一样
-
为什么会是-7? 65529 - 65535 = -6...
-
@MarcusJ 因为 2^16 是 65536,而不是 65535(提示:2 的幂总是偶数)。所以 16 位整数的正确计算是 65529 - 65536,正如预期的那样,是 -7。您可以从负数倒数:-1 是 65535,-2 是 65534,...,-7 是 65529。但 OP 显然没有使用 16 位整数。
-
@MarcusJ 哈,是的,我看到了,但我碰巧在这个页面上,因为没有人回复你的评论(而且你没有删除它),我想迟到总比没有好。
标签: c int unsigned-integer