用C语言区分signed int 与 unsigned int的一种思路

来源:互联网 发布:红警扫矿软件 编辑:程序博客网 时间:2024/06/03 15:30

转载自:http://blog.donews.com/littlefish/archive/2006/03/18/773954.aspx


一:分析
signed int 与 unsigned int在占用字节数是一样的.
不同的是signed int 有一个位用来表示符号位,以来区分数的正负,而unsigned int 没有这一符号位.至少从
表面上我们可以这样认为.
假设int占用n个字节,那么signed int 表示数的范围是(sMin — sMax): 即-2的(n-1)次方 到 2的(n-1)次方
减1; 而unsigned int表示的范围是(uMin — uMax): 即0 到 2的n次方减1;
一个变量只要数据类型确实,它的表示范围也就确定了.

问题可以作如下描述:
假设用一个X代替signed 或 unsigned.
那么一个整型变量num可定义为 X int num; 也就是说,X现在对我们来说是透明的,可能为signed,也可能为unsigned.
现在要做的是,判断此时的num变量为signed int 还是unsigned int;

很明显,如果给num赋一足够大的值,就可以做到使signed int溢出,而unsigned int正常.此时如果取(sMax+1)到uMax之间(包括sMax+1,uMax)的数就可以做到,假设在期间取出一个值为va.然后将va赋值给num,此时如果
X int num;为signed int num;则产生溢出;若此时X int num为 unsigned int num;则正常.

值得注意的是并不能用va溢出后的值来与原va值来作相等与否判断,来判断溢出后的值与原va值不等,然后判
定其为一signed int型变量.因为,其实在内存中溢出前与溢出后两者的表示是一样.以int为四个字节为例,数
值为4294967295,其在内存中表示为FF FF FF FF,而当把它赋给unsigned int变量,溢出后数值为-1,但内存中
的表示仍然为FF FF FF FF,如果此时进行比较操作,此时-1==4294967295 而不是!=
正确的方法是判断va经赋值给num后判断num与0的关系.如果num<0成立则知signed int,否则usigned int;

二:实现程序

/*//Program: judge a integer variable signed or unsigned//Author: Ideal//Date: 2006/3/18*/#include <stdio.h>#include <stdlib.h>#include <math.h>void main(){ signed int sNum; //a signed integer unsigned int uNum; //a unsigned integer unsigned int uMax; //maximal value of integer uMax = (int)pow(2, sizeof(int)*8)-1; sNum = uMax; uNum = uMax;  //compare with zero //not judge sNum equal uMax or not if(sNum < 0)  printf("sNum is signed int variable. \n"); else  printf("sNum is unsigned int variable. \n"); if(uNum < 0)  printf("uNum is signed int variable. \n"); else  printf("uNum is unsigned int variable. \n");}


result:
=========
sNum is signed int variable.
uNum is unsigned int variable.


原创粉丝点击