C02(有符号与无符号)

1 计算机中的符号位

C语言中,数据类型的最高位,用于标识数据的符号。

  • 最高位为1,表明这个数为负数
  • 最高位为0,表明这个数为正数
#include <stdio.h>

int main()
{
    char c = -5;
    short s = 6;
    int i = -7;
    
    printf("%d\n", ( (c & 0x80) != 0 ));  //打印 1
    printf("%d\n", ( (s & 0x8000) != 0 )); //打印 0
    printf("%d\n", ( (i & 0x80000000) != 0 )); //打印 1
    
    return 0;
}

2. 有符号数的表示法

  • 在计算机内部用补码表示负数:正数的补码为正数本身,负数的补码为负数的绝对值各位取反后加1

在这里插入图片描述

3.无符号数的表示法

  • 在计算机内部,用源码表示无符号数:无符号数默认为正数,无符号数没有符号位

  • 对于固定长度的无符号数有:MAX_VALUE +1 --> MIN_VALUE,MIN_VALUE - 1 --> MAX_VALUE

4. signed 和 unsigned

  • 在C语言中,变量默认为有符号的类型
  • unsigned 关键字声明变量为无符号类型

5. 当有符号数与无符号数进行运算

当同类型有符号与无符号整数进行运算时,有符号整数会被转换为无符号整数 (如果整数类型不一致还需要考虑类型转换问题,目前只考虑整数类型一致)

#include <stdio.h>

int main()
{
 
    unsigned int i = 5;
    int j = -10;
    
    if( (i + j) > 0 )
    {
        printf("i + j > 0\n");  //结果大于0,此行打印语句被执行
    }
    else
    {
        printf("i + j <= 0\n");
    }
    
    return 0;
}

6. 错误的使用了unsigned

#include <stdio.h>

int main()
{
 
    unsigned int i = 0;
    
    for(i=9; i>=0; i--)
    {
        printf("i = %u\n", i);
    }
    
    return 0;
}

因为变量i是无符号数,所以i肯定大于等于0,上述的for循环会一直循环下去

6. 总结

  • 有符号数用补码表示:正数的符号位为0,负数的符号位为1

  • 无符号数用源码表示:无符号数没有符号位,无符号数只能用于表示正数以及0

  • unsigned 只能用于修饰正数类型的变量

  • 有符号数与无符号数进行混合运算时,会将有符号数转换成无符号数后再进行计算,计算结果就变成了无符号数了
    无符号数没有符号位,无符号数只能用于表示正数以及0

  • unsigned 只能用于修饰正数类型的变量

  • 有符号数与无符号数进行混合运算时,会将有符号数转换成无符号数后再进行计算,计算结果就变成了无符号数了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值