C++ 条件中的二进制文字

C++ 条件中的二进制文字,c++,integer,implicit-conversion,short,C++,Integer,Implicit Conversion,Short,具有以下简单代码: ... short s1 = 0b1100000000000001; ... if( s1 == 0b1100000000000001 ) printf("==\n"); else printf("!=\n"); 为什么比较表达式需要将文本0b11000000000001显式强制转换为short:s1==(short)0b11000000000001?为什么只是s1==0b11000000000001?不起作用?条件中文本0B11000000000001的默认类型是

具有以下简单代码:

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

为什么比较表达式需要将文本
0b11000000000001
显式强制转换为short:
s1==(short)0b11000000000001
?为什么只是
s1==0b11000000000001
?不起作用?条件中文本0B11000000000001的默认类型是什么?

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

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


文本0B11000000000001的默认类型是什么 状况


根据它是一个
int

“截断”这个词不太合适。所有位都存在,没有任何东西被切断。我想你的意思是“溢出”,这也意味着它是未定义的行为。正如Blaze的回答中所指定的,这是因为你使用的是有符号的short,并且你在你的值中设置了。相反,如果您定义了
无符号短s1=..
,则您的If语句应该按预期工作