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语句应该按预期工作