免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10503 | 回复: 3
打印 上一主题 下一主题

如何判断一个数是无符号数 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2005-10-30 22:35 |显示全部楼层
无符号数的特点就是其计算不会产生溢出,无论经过怎样的运算其运算结果都在其类型的表示范围内;并且这个范围总是从0开始(即计算结果总是大于或者等于0)。

根据无符号数的这个特点,可以写出与有符号数的区别。比如上面Arghawk给出的结果。

还可以根据无符号数的这个特点以及无符号数和同级别的有符号数进行运算的时候有符号数会转化为无符号数的特点写出下面的结果:
  1. #define ISUNSIGNED(a) ( (a) - (a) - 1 > 0 )
复制代码

评分

参与人数 1可用积分 +2 收起 理由
converse + 2 我很赞同

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2007-09-16 16:40 |显示全部楼层
突然发现需要对 #define ISUNSIGNED(a) ( (a) - (a) - 1 > 0 ) 进行如下修正:

#define ISUNSIGNED(a) ( (a) - (a) - (char)1 > 0 )

否则不适用于小于 int 长度的数据类型。

论坛徽章:
0
3 [报告]
发表于 2007-09-18 00:43 |显示全部楼层
原帖由 choc 于 2007-9-17 21:51 发表
不过上面的回答VC++6.0测试都得不到想要的结果


当数据类型的宽度小于 int 长度的时候,确实会出现这种情况。我在上面有些想当然了。

究其原因,主要是 int 以下的类型在计算过程中存在着整型提升、从而将原来的无符号类型转换为 int 有符号类型所致。

因此,无论是 #define ISUNSIGNED(a) ( (a) - (a) - 1 > 0 )

还是 #define ISUNSIGNED(a) ( (a) - (a) - (char)1 > 0 )

以及 #define ISUNSIGNED(a) (a >= 0 && ~a >=0)

都只适用于 int 级别以及以上类型。特此说明。

至于 int 以下级别的类型如何进行判断,还没有找到一个简单易行且通用的方法。

[ 本帖最后由 whyglinux 于 2007-9-18 00:46 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-09-18 01:13 |显示全部楼层
原帖由 vincol 于 2007-9-18 00:53 发表

有比int短的无符号吗?好像没有把


至少就有 unsigned char,也有可能是 unsigned short。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP