为了账号安全,请及时绑定邮箱和手机立即绑定

关于变量赋值的问题。

关于变量赋值的问题。

C++
qq_阿Q_18 2018-08-09 11:52:43
short sam=SHRT_MAX;unsigend  short sue=sam;在1BYTES=8位,short的最大值为32767的系统里,sam=32767.那unsigend short sue=sam; 这个里面的sam变量是指32767还是指SHRT_MAX这个符号常量65535.
查看完整描述

2 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

既然你说 short 最大值为 32767,那么你确定 SHRT_MAX 是 65535??

这个 SHRT_MAX 就是 short 类型能表示的最大值啊!  你那里 SHRT_MAX 应该就是 32767。

查看完整回答
1 反对 回复 2018-08-13
  • qq_阿Q_18
    qq_阿Q_18
    sam是有符号 最大值是32767 sue是无符号 最大值是65595呀 我是想问 short sam=SHRT_MAX这个变量代入到无符号的sue里时 sam代表的是32767还是SHRT_MAX
  • qq_阿Q_18
    qq_阿Q_18
    sam是有符号 最大值是32767 sue是无符号 最大值是65595呀 我是想问 short sam=SHRT_MAX这个变量代入到无符号的sue里时 sam代表的是32767还是SHRT_MAX
  • qq_阿Q_18
    qq_阿Q_18
    不好意思我弄错了是UCHRT
?
onemoo

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。

查看完整回答
反对 回复 2018-08-14
  • 2 回答
  • 1 关注
  • 1096 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信