C++这个位运算是不是被优化掉了?

2019-04-19 23:11:33 +08:00
 Sinksky
#include<bits/stdc++.h>
using namespace std;
#define uc unsigned char
char cal(char c,int k){
	return (c>>(7-k))&1;
}
void print(char c){
	for(int i = 0;i < 8;++i)
		cout << (int)(cal(c,i));
}
int main(void){
	uc a = 'c';
	cout << "a 二进制表示: ";print(a);cout << endl;
	uc b = (a<<2)>>2;
	cout << "b 二进制表示: ";print(b);cout << endl;
	uc c = a<<2;
	cout << "c 二进制表示: ";print(c);cout << endl;
	uc d = c>>2;
	cout << "d 二进制表示: ";print(d);cout << endl;
	return 0;
} 

输出结果

a 二进制表示: 01100011
b 二进制表示: 01100011
c 二进制表示: 10001100
d 二进制表示: 00100011

在 b 的定义中左移右移写一起,因为逻辑右移,前面应该补 0 然而没有.
分开写就行了
编译器 TDM-GCC 4.9.2 64-bit Release
怎么取消它的优化呢?-O0 好像也不行.
遇到这种位运算写一起的情况不知道咋办了.

2736 次点击
所在节点    C
6 条回复
exch4nge
2019-04-20 00:46:55 +08:00
试试这个 ((uc)(a<<2))>>2
Bromine0x23
2019-04-20 01:01:53 +08:00
(a << 2) >> 2 的结果类型是 int,并不需要补 0
soli
2019-04-20 01:16:12 +08:00
这应该是『整型提升』。
zealot0630
2019-04-20 09:29:00 +08:00
尽量用 auto,非必要时不用指定类型,能少踩类似坑
smdbh
2019-04-20 15:46:39 +08:00
@exch4nge
uc b = (uc)(a<<2)>>2;
Sinksky
2019-04-20 19:40:50 +08:00
是运算过程中进行了整型提升.
1L 的语句是有效的,已尝试,因为在进行第二次操作之前进行了转型.
cout << typeid(a<<2).name() << endl;
运行此语句可得到 a<<2(a 为无符号字符类型)是 int 类型.
谢谢各位 dalao 的帮助. :)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/556925

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX