2、有符号数与无符号数

前言

狄泰软件唐老师的个人学习笔记

1、有符号数

有符号数中数据类型的最高位是数据的符号位

  • 最高位为1,表明这个数为负数
  • 最高位为0,表明这个数为正数

实验:检验数据的最高位是否是 符号位

#include <stdio.h>

int main()
{
	char i = 5;
	short a = 2;
	int b = -2 ;
	
	printf("%d\n", ((i&0x80) != 0 ) );	//0, 
	printf("%d\n", ((a&0x8000) != 0 ) ); //0
	printf("%d\n", ((b&0x80000000) != 0 ) );//1,	
	//复数最高位是1,与过还是1
	return 0;
}

计算机内部,最高位为符号位,其他位用补码表示有符号数

  • 正数的补码是 正数本身
  • 负数的补码负数的绝对值各位取反+1

8位整数 5 的补码为: 0000 0101
8位整数 -7 的补码为:1111 1001 (7为 0000 0111 ,各位取反 1111 1000,再+1 )
16位整数 20 的补码为: 0000 0000 0001 0100
16位整数 -13 的补码为:1111 1111 1111 0011

2、无符号数

  • 计算机中用 原码表示无符号数
  • 无符号数默认正数 (最小值为0,最大值看占用内存)
    • 对于无符号数,最大值+1 = 最小值(0);最小值 (0)-1 = 最大值
  • 由于无符号数没有符号位,所以无符号数的范围比有符号数大一倍

signed与unsigned
C语言中变量默认为有符号的类型
unsigned关键字声明变量为无符号类型,比如 unsigned char
其中,float没有无符号,不能用unsigned

实验:有符号数与无符号数运算

#include <stdio.h>

int main()
{
	unsigned int i = 5;
	int j = -10;
	
	if( (i+j) > 0 )
	{
		printf("i+j > 0");//这里输出,原因如下
	}
	else
	{
		printf("i+j < 0");
	}	
	return 0;
}

当有符号数与无符号数一起运算时,有符号数会被看作无符号数
-10 为的二进制 1111 1111 1111 1111 1111 1111 1111 0110,把这个看作无符号,这是很大的正数,所以i+j > 0

实验:

#include <stdio.h>

int main()
{
	unsigned int i = 0for( i=9; i>=0; i--)
    {
        printf("i=%u", i);	//%u是无符号十进制整数
    }
	return 0;
}

因为是无符号整数,i 为0后再减是最大值,不会是期望中的负数,所以for循环一直执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值