C语言有符号数和无符号数的判断方法


title: C语言有符号数和无符号数的判断方法
date: 2019-2-12 15:39:26
tags: C

学完CSAPP有符号数和无符号数的部分后冒出了这个问题,在网上查找资料后总结下。应用场景:在一个新系统中,不知道该系统是否支持无符号数。

基础知识

计算机中的整数分为无符号数和有符号数,假设字长2字节(4个16进制数组成,w = 16):

  • 无符号数如0xFFFF,从第1位到第16位都是数值1;
  • 有符号数如0xF000,第一位的1是符号位,表示这个数为负数,后面的3个1和12个0是数值位,用来代入计算数值。

有符号数有三种存储方法:补码、反码和原码,一般计算机都采用补码来存。

需要明确的是如果一个数本身小于0,那么肯定为有符号数,无须判断。以下假设预判断的数 a >= 0,不考虑溢出。

方法一:无符号数永远大于0

由该性质知,对无符号数取反,将得到正值;对有符号数取反,正负属性必定发生变化,相与必定小于0。(来自《C专家编程》)

代码:
#define ISUNSIGNED(a) (a >= 0 && ~a >= 0)

方法二:位运算

将a的最高位置1,如果大于0则为无符号数
代码:
#define ISUNSIGNED(a) (a | (1 << 31) > 0)

方法三:无符号数和有符号数相减

假设b为有符号数-1。
代码:
#define ISUNSIGNED(a) ((b - a) < 0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值