【问题标题】:signed char to 0x80 cause truncation of constant value有符号的 char 到 0x80 导致常量值的截断
【发布时间】:2016-11-11 03:24:26
【问题描述】:
int _tmain(int argc, _TCHAR* argv[])
{
    signed char min = -128;  //line1
    signed char min2 = 0x80; //line2
}

line1,好的 第 2 行,警告 C4309 'conversion' : 截断常量值

VS2010,-WX -W4

0x80和-128一样,怎么回事?

【问题讨论】:

  • 这会尝试执行数字转换,不是位。无论如何,即使确实如此,您也不应该依赖关于位表示的假设,因为它本质上是不可移植的。
  • @underscore_d 在这个问题中的位有什么关系?您只有两种不同的方式来表示数字常量:十进制和十六进制。
  • @CodyGray 0x800b10000000,它将 -128 编码为 8 位二进制补码。我假设 OP 认为他们可以利用这种偶然性。无论哪种方式,都值得警惕。同样,程序将尝试使用源的数值而不是其位表示来转换为目标类型。
  • ...并且十六进制是无符号的,所以0x80+ 128,与 8 位二进制补码 -128 的位相似性是一个无关紧要的巧合标准。

标签: c++


【解决方案1】:

相同:0x80 是 128,而不是 -128。

很可能在初始化时转换为-128,虽然标准不保证这一点:

如果目标类型是有符号的,如果它可以在目标类型(和位域宽度)中表示,则值不变;否则,该值是实现定义的

【讨论】:

    【解决方案2】:

    signed char 的范围为 -128 到 127(包括两者)。您正在为其分配 128 (0x80)。因此截断它,因为它超出了范围。

    【讨论】:

      猜你喜欢
      • 2012-11-19
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 2013-07-24
      • 2018-03-09
      • 2017-03-08
      • 2013-10-26
      • 2012-03-07
      相关资源
      最近更新 更多