栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

相同长度数据类型位运算

#include
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  = %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;
}

运行结果: 

 

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

#include
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) = %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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743694.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号