转载自: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.