相同长度数据类型位运算
#include<stdio.h>
int main(int argc, int* argv[]){
int a_int1 = 0xFFFFFFFF; //有符号数负数
int a_int2 = 0xFFFFFFFE; //有符号数负数
int a_int3 = 0x7FFFFFFF; //有符号数正数
int a_int4 = 0x7FFFFFFE; //有符号数正数
unsigned int b_uint1 = 0xFFFFFFFF; //无符号数 最高位为1
unsigned int b_uint2 = 0xFFFFFFFE; //无符号数 最高位为1
unsigned int b_uint3 = 0x7FFFFFFF; //无符号数 最高位为0
unsigned int b_uint4 = 0x7FFFFFFE; //无符号数 最高位为0
printf("a_int1 = %x\n", a_int1);
printf("a_int2 = %x\n", a_int2);
printf("a_int3 = %x\n", a_int3);
printf("a_int4 = %x\n", a_int4);
printf("b_uint1 = %x\n", b_uint1);
printf("b_uint2 = %x\n", b_uint2);
printf("b_uint3 = %x\n", b_uint3);
printf("b_uint4 = %x\n", b_uint4);
//左移一位结果
printf("\n--- 左移一位 ---\n");
printf("a_int1 = %x\n", a_int1 << 1);
printf("a_int2 = %x\n", a_int2 << 1);
printf("a_int3 = %x\n", a_int3 << 1);
printf("a_int4 = %x\n", a_int4 << 1);
printf("b_uint1 = %x\n", b_uint1 << 1);
printf("b_uint2 = %x\n", b_uint2 << 1);
printf("b_uint3 = %x\n", b_uint3 << 1);
printf("b_uint4 = %x\n", b_uint4 << 1);
//右移一位结果
printf("\n--- 右移一位 ---\n");
printf("a_int1 = %x\n", a_int1 >> 1);
printf("a_int2 = %x\n", a_int2 >> 1);
printf("a_int3 = %x\n", a_int3 >> 1);
printf("a_int4 = %x\n", a_int4 >> 1);
printf("b_uint1 = %x\n", b_uint1 >> 1);
printf("b_uint2 = %x\n", b_uint2 >> 1);
printf("b_uint3 = %x\n", b_uint3 >> 1);
printf("b_uint4 = %x\n", b_uint4 >> 1);
//按位与
printf("\n--- 按位与运算 ---\n");
printf("a_int1 & a_int2 = %x\n", a_int1 & a_int2);//有符号负数与有符号负数与
printf("a_int3 & a_int4 = %x\n", a_int1 & a_int4);//有符号正数与有符号正数与
printf("a_int1 & a_int3 = %x\n", a_int1 & a_int3);//有符号正数与有符号正数与
return 0;
}
运行结果:?
?
?不同长度数据类型进行位运算
#include<stdio.h>
int main(int argc, int* argv[]){
int a_int = 0xFFFFFFFF; //有符号数负整数
unsigned int a_uint = 0xFFFFFFFF;//无符号整数
char b_char1 = 0xFF;
char b_char2 = 0x7F;
unsigned char b_uchar = 0xFF;
printf("sizeof(int) = %ld\n", sizeof(int));
printf("sizeof(unsigned int) = %ld\n", sizeof( unsigned int));
printf("sizeof(char) = %ld\n", sizeof(char));
printf("sizeof(unsigned char) = %ld\n", sizeof(unsigned char));
printf("a_int & b_char1 = %x\n", a_int & b_char1);
printf("a_int & b_char2 = %x\n", a_int & b_char2);
printf("a_int & b_uchar = %x\n", a_int & b_uchar);
printf("a_uint & b_char = %x\n", a_uint & b_char1);
printf("a_uint & b_uchar = %x\n", a_uint & b_uchar);
return 0;
}
运行结果:?
?
?
?总结
- 变量赋值时是按照补码进行赋值的。
- 有符号数左位移右侧补0
- 有符号数右位移左侧补符号位(正数补0,负数补1)
- 有符号数或无符号数进行位运算时符号位参与运算
- 不同类型的变量进行位运算时,占用空间较小的变量隐式转换为占用空间较大的变量空间大小的有符号数。
- 有符号数进行隐式变量类型转换时值不变,转换为占用相同空间大小的补码
- 无符号数进行隐式变量类型转换时,转换为相同空间大小的变量高字节补0
|