【发布时间】: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
0x80是0b10000000,它将-128编码为 8 位二进制补码。我假设 OP 认为他们可以利用这种偶然性。无论哪种方式,都值得警惕。同样,程序将尝试使用源的数值而不是其位表示来转换为目标类型。 -
...并且十六进制是无符号的,所以
0x80是 + 128,与 8 位二进制补码 -128 的位相似性是一个无关紧要的巧合标准。
标签: c++