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;