用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.
- 用C语言区分signed int 与 unsigned int的一种思路
- C语言 算术转换 unsigned signed int
- [C语言]unsigned int与 int
- C语言中unsigned int 与 int 的自动转换
- C语言unsigned char、char与int之间的转换
- C语言:探测 unsigned int 的边界
- c语言中unsigned int和int的区别
- C语言之unsigned int和int的运算
- c语言中unsigned int和int的区别
- signed int 和 unsigned int 在一起运算
- unsigned int 与 int
- unsigned int与int
- C语言中signed与unsigned的转换
- C语言之unsigned 与signed
- C语言 unsigned与signed区别
- int,signed int和unsigned int 以及printf 的%u,%d的区别
- unsigned int与int相加的问题
- unsigned/signed int/char类型表示的数值范围
- 解读 Oracle 12c 的 12 个新特性
- Android压缩图片到100K以下并保持不失真的高效方法
- < jsp:setProperty>元素使用全解
- android手势识别(转)
- 解决全站中文乱码问题
- 用C语言区分signed int 与 unsigned int的一种思路
- [网络] SOCKET, TCP/UDP, HTTP, FTP
- top命令
- android开发环境配置
- 获取本机网络信息
- Java 数字签名原理及产生
- Cookie
- rails 自关联、批写入、layout布局的选择顺序
- Python完全新手教程