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