2 回答

TA贡献883条经验 获得超454个赞
既然你说 short 最大值为 32767,那么你确定 SHRT_MAX 是 65535??
这个 SHRT_MAX 就是 short 类型能表示的最大值啊! 你那里 SHRT_MAX 应该就是 32767。

TA贡献883条经验 获得超454个赞
我大概知道你想问的了,就再多说些吧。
首先我还是想说:你说是 UCHRT_... 是不是笔误了? UCHRT_MAX 可是 unsigned char 的最大值啊...
因为你提到了 65535,所以你是不是想说 USHRT_MAX? 这才是 unsigned short 的最大值,通常是 65535。我假设你想问的是这个。
short sam = USHRT_MAX; 实际上就是 short sam = 65535;
在这样进行初始化时,会发生一些隐式转型。等号左侧是有符号 short 类型,而显然右侧的值超过了 short 的取值范围。
请注意:这种情形下,在左侧是有符号整型时,C++ 标准没有具体规定右侧值将会如何赋予左侧,不同平台自己决定这时该如何操作。有可能会发生按位截断,也有可能会保留能取得的最大值,甚至有别的行为。
如果发生“按位截断”——当然两侧类型位数相同,实际上没有“截掉”位,但由于在 short 中高位成为符号位—— sam 的值就是 -1。
而再把 -1 赋给无符号的 sue 时,就直接按位解释为 unsigned short 了(因为这里两侧类型的位数相同,符号位不需要额外扩展),所以 sue 就是 65535。
注意,虽然 sue 仍是 65535,但不是因为 sam 中强行保存了超范围的数,而是因为这个数的实际二进制表示没有变化。
如果发生“保留最大值”,那么 sam 就是 32767 了。而再将 sam 给 sue,那么 sue 也只能得到 32767。
如果发生其他行为,那么 sue 可能又会得到别的值...
所以,可以看到, sue 最后得到什么值完全是平台相关的。严格的标准答案就是:不能确定。
不过就我的观察来说,大多数平台上都会采用“按位截断”的方式,所以 sue 得到的值一般都是 65535。
- 2 回答
- 1 关注
- 1140 浏览
添加回答
举报