c语言复习2之有符号与无符号

在学习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


猜你喜欢

转载自blog.csdn.net/qq_39809601/article/details/80755126