#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 好像也不行.
遇到这种位运算写一起的情况不知道咋办了.
|  |      1exch4nge      2019-04-20 00:46:55 +08:00 via iPhone  1 试试这个 ((uc)(a<<2))>>2 | 
|  |      2Bromine0x23      2019-04-20 01:01:53 +08:00  1 (a << 2) >> 2 的结果类型是 int,并不需要补 0 | 
|  |      3soli      2019-04-20 01:16:12 +08:00  3 这应该是『整型提升』。 | 
|      4zealot0630      2019-04-20 09:29:00 +08:00 via Android 尽量用 auto,非必要时不用指定类型,能少踩类似坑 | 
|  |      6Sinksky OP 是运算过程中进行了整型提升. 1L 的语句是有效的,已尝试,因为在进行第二次操作之前进行了转型. cout << typeid(a<<2).name() << endl; 运行此语句可得到 a<<2(a 为无符号字符类型)是 int 类型. 谢谢各位 dalao 的帮助. :) |