有符号与无符号

1、计算机中的符号位 

有符号编码规则:数据的最高位用于标识数据的符号

               - 最高位为1,表示这个数为负数

               - 最高位为0,表示这个数为正数

无符号编码规则:数据的最高位不代表符号位

               - 计算机不知道数据的正负,看人怎么看待

 

2、编程实验

有符号数的符号位   2-1.c

#include <stdio.h>

int main()
{
    char c = -5;
    short s = 6;
    int i = -7;
    
    printf("%d\n", ( (c & 0x80) != 0 ));    //最高位为1
    printf("%d\n", ( (s & 0x8000) != 0 ));    //最高位为0
    printf("%d\n", ( (i & 0x80000000) != 0 ));    //最高位为1
    
    return 0;
}

 

 

3、有符号数和无符号数的表示法

         在计算机内部用补码表示有符号数

                 - 正数的补码(原码,反码)为正数本身

                 - 负数的补码为负数的绝对值各位取反后加1

                          8位整数5的补码    0000 0101

                          8位整数-7的补码    1111 1001

                         16位整数20的补码   0000 0000 0001 0100

                         16位整数-13的补码   1111 1111 1111 0011

                  可以说正数原码存储,负数补码存储(调试时观看内存数据即可发现)

同理对于内存中的数据FF或01等也要表明以无符号解析(%u)还是有符号解析(%d)

#include <stdio.h>

int main()
{
	int c = 0xFFFFFFFF;
	unsigned int uc = 0xFFFFFFFF;

	printf("%d\n", c);//有符号打印 -1
	printf("%u\n", c);//无符号打印 4294967295
	printf("%d\n", uc);//有符号打印 -1
	printf("%u\n", uc);//无符号打印 4294967295

	return 0;
}

 

         在计算机内部用原码表示无符号数

                 - 无符号数默认为正数

                 - 无符号数没有符号位

          对于固定长度的无符号数

                 - MAX_VALUE + 1 → MIN_VALUE

                 - MIN_VALUE  -  1 → MAX_VALUE

                          一个字节的无符号数 1111 1111   +    1   =   0

                          一个字节的无符号数  0  -   1     =   1111 1111

signed 和 unsigned

                 - C语言中变量默认为有符号型

                 - unsigned关键字声明变量为无符号型

                       C语言只有整数类型能声明unsigned变量

4、实例分析

当无符号数遇见有符号数   2-2.c

#include <stdio.h>

int main()
{
 
    unsigned int i = 5;
    int j = -10;
    
    if( (i + j) > 0 )
    {
        printf("i + j > 0\n");
    }
    else
    {
        printf("i + j <= 0\n");
    }
    
    return 0;
}

  

 当无符号数和有符号数运算时,有符号数会被转化为无符号数

 

错误使用unsigned   2-3.c

#include <stdio.h>

int main()
{
 
    unsigned int i = 0;
    
    for(i=9; i>=0; i--)
    {
        printf("i = %u\n", i);
    }
    
    return 0;
}


                                

                   因为i永远大于等于0MIN_VALUE-1 → MAX_VALUE

 

有符号与无符号的类型转换 test.c

#include <stdio.h>

int main()
{
	signed char c1 = -1; //0xFF, 1111 1111   
	signed char c2 = 0x7F; //0111 1111 ->127
	unsigned char uc = -1; //0xFF  255

	int x = c1; //补1,0xFFFFFFFF, 111111111111111111111111  1111 1111
	int y = c2;//补0,0x0000007F, 000000000000000000000000  0111 1111
	int z = uc;//补0, 0x000000FF

	printf("%x\n", x);//ffffffff
	printf("%x\n", y);//7f
	printf("%x\n", z);//7f

	return 0;
}

 

5、小结    

           有符号数用补码表示

                 - 正数的符号位为0

                 - 负数的符号位为1

           无符号数用原码表示

                 - 无符号数没有符号位

                 - 无符号数只能用于表示正数

           unsigned只能用于修饰整数类型的的变量

                            当无符号数与有符号数混合计算时,会将有符号数

                            转化为无符号数后再进行计算,结果为无符号数

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值