我正在研究签名无符号整数转换,我得出了这些结论,有人可以告诉我这是否正确
unsigned short var = -65537u;
步骤:
二进制表示: 0000 0000 0000 0001 0000 0000 0000 0001
二进制代表:1111 1111 1111 1110 1111 1111 1111 1111
二进制代表:1111 1111 1111 1111
同样适用于以下情况:
unsigned short var = -65541u;
1111 1111 1111 1110 1111 1111 1111 1011
1111 1111 1111 1011
unsigned short var = -5u;
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1011
答案 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位。