unsigned / signed short / int转换

时间:2013-03-02 10:34:44

标签: c++ c

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

unsigned short var = -65537u;

步骤:

  • 65537u(隐式转换为unsigned int)

二进制表示: 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(unsigned int)
<00> 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(unsigned int)
<00> 0000 0000 0000 0000 0000 0000 0000 0101

  • -5u

1111 1111 1111 1111 1111 1111 1111 1011

  • 截断

1111 1111 1111 1011

  • 读为无符号短语:65531

2 个答案:

答案 0 :(得分:2)

对于short为16位且int为32位的常用平台,您的分析是正确的。

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

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

相反,C99标准允许unsigned short保持16位以上。在这种情况下,var会收到USHRT_MAX-65536作为您的第一个示例,同样会收到其他示例。

答案 1 :(得分:0)

short的大小取决于实现 - 而不是16位。 16位是最小大小。类似地,int的大小也可能只有16位。