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

本文介绍了一种通过赋值特定数值来判断C/C++中整型变量是带符号还是无符号的方法,并给出了具体的实现程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值