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)

你可能感兴趣的:(C/C++)