细谈有符号与无符号数的区别(一)
(2012-02-21 11:02:34)
int main()
{
unsigned int a=32;
int b=-6;
unsigned int c=a+b;
printf("%u",c);
}
无意看到以上代码,发现自己也是一知半解的,这才决定弄透一点。
以下均为自己对网上资料的理解,希望对大家能有所帮助,有误之处,还请海涵。
首先列举下数据类型:(signed )int ,unsigned int ,float ,double ,char
注意点:
1.声明无符号整型时,我们都加上unsigned int ,而声明有符号整型时用signed int,
我们平常直接写int,省掉了signed.
另外,unsigned若省略后一个关键字,大多数编译器都会认为是unsigned int。
2.在计算机中,整数是以补码形式存放的
(只是带符号的整数采用补码存储表示的,浮点数另有其存储方式)。
4.整形数运算,总是遵循一个原则:小的往大的扩展
从小到大:short -> unsigned short -> int -> unsigned int
下面说说各数据类型值的范围
(32 bit Operate System,通过开始——运行,输入DXDIAG 命令即可查到自己电脑系统位数):
既然只对signed int 才有所谓的原码、反码和补码,那我们就对signed int 来分析,
注意点:
1.码制转换后的数就应该理解成无符号型的了,不然只对有符号型整数转换干嘛
3.符号位也是要占地方的。假如一个8位的系统,a=-6,其原码就该写成1000 0110,
大家知道的,可以说说结果-2147483648是如何来的?
-
回答博主的问题:
int c 最后存放的数据为0x80000000,
作为有符号数:2147483648,很显然的。
作为无符号的int:-2147483648,这个数并没有超过界限,
int所能表示的数据范围在:-2147483648 ~ 2147483647。