Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3020526
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2013-02-27 17:23:26

看到这道题有点意思, 主要考对符号位的理解和对类型的解释问题.


首先int型是有符号的, 最高位作为符号位, 如果是负数, 最高位则为1, 正数符号位是0.

而unsigned int是把所有位都参与计数, 所以无符号数肯定是一个正整数.


我能只能设计一段代码, 或者一个宏函数. 而不能设计一个函数来验证, 因为函数接收参数, 是什么类型, 编译器就解释为什么类型, 做强制类型转换. 所以只能在当前函数内判断.


我们设计一个宏函数:


  1. #include <stdio.h>

  2. #define SIGN(a) (a>=0 && ~a>=0)

  3. int main(void) {
  4.         unsigned int m = 1000;
  5.         int n = 1000;

  6.         printf("%d, %dn", SIGN(m), SIGN(n));
  7.         return 0;
  8. }

首先判断这个数是否大于0, 如果是负数直接就短路返回条件假. 如果是正数, 那么可能这个数是无符号数, 也可能是有符号数的正数, 所以接下来对该数取反, 无符号数无论如何操作, 它都是正整数, 但是有符号的正数取反的话最高位会变成1, 作为符号位计算, 它就会被解释成一个负数了.


阅读(4976) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~