在学习c语言的过程中,我们经常遇到unsigned int(这里只能为整型) 或signed ,这样的类型说明符,他们就是无符号与有符号的类型说明符。
有符号就是可以表示负数,而无符号只能表示正数。那么在c语言中怎么区分这些的呢?
在有符号数中如int ,4个字节,32位,他就用最高位的0,1来表示正负号,0表示正号,1表示负号。
char c=-15;
short s=15;
int i=-15;
sign = (c&0x80)//不等于0
sign = (s&0x80)//等于0
sign = (i&0x80)//不等于0
而在无符号数中,最高位就不用来表示正负号了。所以有无符号数表示的数据范围就不一样了
无符号数表示的范围是0~2的n-1次方。有符号数为-2的n-2次方到0~2的n-2次方
那么当有符号数赋给无符号数会发生什么呢?
首先在计算机里用补码表示符号数,正数的补码为正数的本身,负数的补码为绝对值取反然后加1
8位整数如5为 0000 0101,-5为1111 1011
所以把一个小的负数赋值给一个无符号数,则这个无符号数会变成一个很大的正数。
如果你写出了一个这样的程序将会是一个死循环
unsigned int i=10;
while(i<0)
{
........
i--;
}
在计算机里对于固定长度的无符号数
MAX_VALUE+1=MIN_VALUE;
MIN_VALUE-1=MAX_VALUE;
小结:
1有符号数用补码表示
最高位0表示正数
最高位1表示负数
2无符号数用原码表示
无符号数没有符号位
无符号数只表示正数
3unsigned只能修饰整数类型的变量
当有符号数与无符号进行混合运算是,有符号数会转换为无符号数,然后再进行计算,结果为无符号数
学习交流群199546072