2

我正在研究有符号-无符号整数转换,我得出了这些结论,有人可以告诉我这是否正确

unsigned short var = -65537u;

脚步:

  • 65537u(隐式转换为无符号整数)

二进制表示:0000 0000 0000 0001 0000 0000 0000 0001

  • -65537u

二进制表示:1111 1111 1111 1110 1111 1111 1111 1111

  • 截短

二进制表示:1111 1111 1111 1111

  • 读为无符号短:65535

这同样适用于以下情况:

unsigned short var = -65541u;
  • 65541u(无符号整数)

0000 0000 0000 0001 0000 0000 0000 0101

  • -65541u

1111 1111 1111 1110 1111 1111 1111 1011

  • 截短

1111 1111 1111 1011

  • 读为无符号短:65531

unsigned short var = -5u;
  • 5u(无符号整数)

0000 0000 0000 0000 0000 0000 0000 0101

  • -5u

1111 1111 1111 1111 1111 1111 1111 1011

  • 截短

1111 1111 1111 1011

  • 读为无符号短:65531
4

2 回答 2

2

short您的分析对于16 位和int32 位的常用平台是正确的。

对于某些平台,常量65537可能不适合unsigned int,但如果是这种情况,65537u将被键入为更大的无符号类型。可以在 C99 标准的第 6.4.4.1:5 节中找到尝试过的类型列表。在 C99 中,它至少适合 ,unsigned long标准保证允许值那么大。

如果发生这种情况,推理仍然大致相同,直到转换回unsigned short分配。

相反,unsigned shortC99 标准允许保存超过 16 位。在这种情况下,您的第一个示例var接收USHRT_MAX-65536,其他示例接收类似。

于 2013-03-02T11:20:17.593 回答
0

short 的大小取决于实现 - 而不是 16 位。16bit 是最小尺寸。

同样,int 的大小也可能只有 16 位。

于 2013-03-02T10:49:04.477 回答