条件中的二进制字面量

3
以下是简单的代码示例:

有以下简单的代码:

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

为什么比较表达式需要将文本0b1100000000000001显式转换为短整型:s1 == (short)0b1100000000000001?为什么只是s1 == 0b1100000000000001?不起作用?在条件语句中,文字0b1100000000000001的默认类型是什么?

正如Blaze的回答所指出的那样,这是因为您正在使用有符号短整型,并且在值中设置了符号位。如果您改为定义unsigned short s1 = ....,则您的if语句应该按预期工作。 - cprlkleg
1个回答

2
使用有符号的16位short类型,short s1 = 0b1100000000000001; 不会适合。它将被转换为 -16383,因为最高有效位(表示值为32768的位)在有符号的16位short类型中表示-32768的值,因此它比原值低了65536。这就是为什么它不等于0b1100000000000001(即49153)。你的编译器应该在这里发出警告。
通过在比较中使用(short)0b1100000000000001,你强制执行相同的转换,这就是为什么它可以工作的原因。所以现在你正在比较-16383-16383
默认的字面量0b1100000000000001的类型是int,根据这里的说明。

“截断”不是很准确的词。所有位都存在,没有被切掉。我认为你的意思是“溢出”,这也意味着它是未定义的行为。 - nwp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接