【问题标题】:Binary literal in condition条件中的二进制文字
【发布时间】:2019-05-07 09:08:58
【问题描述】:

有以下简单代码:

...
short s1 = 0b1100000000000001;
...
if( s1 == 0b1100000000000001 )
  printf("==\n");
else
  printf("!=\n");

为什么比较表达式需要将文字 0b1100000000000001 显式转换为short:s1 == (short)0b1100000000000001?为什么只是s1 == 0b1100000000000001?不工作?字面量 0b1100000000000001 的默认类型是什么?

【问题讨论】:

  • 正如 Blaze 的回答中所指定的,这是因为您使用的是签名短,并且您在值中设置了 sign bit。相反,如果您定义了unsigned short s1 = ....,则您的 if 语句应该可以按预期工作

标签: c++ integer implicit-conversion short


【解决方案1】:

带有签名的 16 位短裤,short s1 = 0b1100000000000001; 不适合。它将被转换为-16383,因为最高有效位(表示32768 的值)在有符号的16 位short 中表示-32768 的值,因此它的65536 更低。这就是为什么它不等于0b1100000000000001(即49153)。您的编译器应在此处发出警告。

通过在比较中说(short)0b1100000000000001,您将在那里执行相同的转换,这就是它使用它的原因。所以现在您将-16383-16383 进行比较。


文字 0b1100000000000001 的默认类型是什么 条件?

根据thisint

【讨论】:

  • “截断”这个词不太合适。所有位都存在,没有任何东西被切断。我认为您的意思是“溢出”,这也意味着它是未定义的行为。
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2018-11-11
  • 2015-07-02
  • 2020-02-22
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多