欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

C语言位运算之有符号数和无符号数

时间:2023-04-26

相同长度数据类型位运算

#includeint 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 = %xn", a_int1); printf("a_int2 = %xn", a_int2); printf("a_int3 = %xn", a_int3); printf("a_int4 = %xn", a_int4); printf("b_uint1 = %xn", b_uint1); printf("b_uint2 = %xn", b_uint2); printf("b_uint3 = %xn", b_uint3); printf("b_uint4 = %xn", b_uint4); //左移一位结果 printf("n--- 左移一位 ---n"); printf("a_int1 = %xn", a_int1 << 1); printf("a_int2 = %xn", a_int2 << 1); printf("a_int3 = %xn", a_int3 << 1); printf("a_int4 = %xn", a_int4 << 1); printf("b_uint1 = %xn", b_uint1 << 1); printf("b_uint2 = %xn", b_uint2 << 1); printf("b_uint3 = %xn", b_uint3 << 1); printf("b_uint4 = %xn", b_uint4 << 1); //右移一位结果 printf("n--- 右移一位 ---n"); printf("a_int1 = %xn", a_int1 >> 1); printf("a_int2 = %xn", a_int2 >> 1); printf("a_int3 = %xn", a_int3 >> 1); printf("a_int4 = %xn", a_int4 >> 1); printf("b_uint1 = %xn", b_uint1 >> 1); printf("b_uint2 = %xn", b_uint2 >> 1); printf("b_uint3 = %xn", b_uint3 >> 1); printf("b_uint4 = %xn", b_uint4 >> 1); //按位与 printf("n--- 按位与运算 ---n"); printf("a_int1 & a_int2 = %xn", a_int1 & a_int2);//有符号负数与有符号负数与 printf("a_int3 & a_int4 = %xn", a_int1 & a_int4);//有符号正数与有符号正数与 printf("a_int1 & a_int3 = %xn", a_int1 & a_int3);//有符号正数与有符号正数与 return 0;}

运行结果: 

 

 不同长度数据类型进行位运算

#includeint 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) = %ldn", sizeof(int)); printf("sizeof(unsigned int) = %ldn", sizeof( unsigned int)); printf("sizeof(char) = %ldn", sizeof(char)); printf("sizeof(unsigned char) = %ldn", sizeof(unsigned char)); printf("a_int & b_char1 = %xn", a_int & b_char1); printf("a_int & b_char2 = %xn", a_int & b_char2); printf("a_int & b_uchar = %xn", a_int & b_uchar); printf("a_uint & b_char = %xn", a_uint & b_char1); printf("a_uint & b_uchar = %xn", a_uint & b_uchar); return 0;}

运行结果: 

 

 

 总结

变量赋值时是按照补码进行赋值的。有符号数左位移右侧补0有符号数右位移左侧补符号位(正数补0,负数补1)有符号数或无符号数进行位运算时符号位参与运算不同类型的变量进行位运算时,占用空间较小的变量隐式转换为占用空间较大的变量空间大小的有符号数。有符号数进行隐式变量类型转换时值不变,转换为占用相同空间大小的补码无符号数进行隐式变量类型转换时,转换为相同空间大小的变量高字节补0

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。