Chinaunix首页 | 论坛 | 博客
  • 博客访问: 642027
  • 博文数量: 108
  • 博客积分: 46
  • 博客等级: 民兵
  • 技术积分: 1279
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-16 11:36
个人简介

坐井以观天

文章分类

全部博文(108)

文章存档

2014年(13)

2013年(90)

2012年(6)

分类: LINUX

2013-04-07 15:16:14

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


首先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, 作为符号位计算, 它就会被解释成一个负数了.


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