C++ 布尔函数上的左移位和右移位
我试图举例说明积分提升是如何与算术移位运算符一起工作的。特别是,我想知道,C++ 布尔函数上的左移位和右移位,c++,standards,c++14,bit-shift,integer-promotion,C++,Standards,C++14,Bit Shift,Integer Promotion,我试图举例说明积分提升是如何与算术移位运算符一起工作的。特别是,我想知道,a、b、c、d、e、f、g、h的哪些值是根据c++14标准准确定义的,哪些值取决于平台/硬件/编译器(假设sizeof(int)==4) int a=true>3; int c=真值>3U; int e=真>31; int g=真值>31U; 来自[expr.shift]: 结果的类型是提升的左操作数的类型。如果正确的操作数 为负,或大于或等于提升后的左操作数的位长度 移动bool的结果类型始终为int,无论右侧是什么。我
a、b、c、d、e、f、g、h的哪些值是根据c++14标准准确定义的,哪些值取决于平台/硬件/编译器(假设sizeof(int)==4
)
int a=true>3;
int c=真值>3U;
int e=真>31;
int g=真值>31U;
来自[expr.shift]:
结果的类型是提升的左操作数的类型。如果正确的操作数
为负,或大于或等于提升后的左操作数的位长度
移动bool
的结果类型始终为int
,无论右侧是什么。我们从来不会改变至少32或一个负数,所以我们在所有帐户上都可以
对于左移位(E1以下主要是对Barry答案的补充,这清楚地解释了左移位和右移位的规则
至少对于C++11,bool的整体升级为0表示false
,1表示true
:4.5整体升级[conv.prom]§6
bool类型的prvalue可以转换为int类型的prvalue,false变为零,true变为一
因此,在最初的示例中,b
、d
、f
和h
都将得到一个0值,a
和c
都得到一个8
值:在此之前,只有完美定义的行为
但是e
和g
将接收无符号值0x8000000
,因此,如果您将其影响为无符号整数变量,则可以,但您使用的是有符号32位整数。因此,您得到一个整数转换:4.7整数转换[conv.integral]§3
如果目标类型是有符号的,则如果可以在目标类型中表示该值,则该值将保持不变;否则,该值将由实现定义
无符号0x8000000不能用有符号64位整数表示,因此结果是为e
和g
定义的实现可能重复:@ThomasMatthews您链接的问题根本不涉及位移位。
int a = true << 3;
int b = true >> 3;
int c = true << 3U;
int d = true >> 3U;
int e = true << 31;
int f = true >> 31;
int g = true << 31U;
int h = true >> 31U;