无符号整形和有符号整形的比较

整形数据存储形式

在计算机内存里,整数以补码形式存储(正数的补码即原码)。

进制的转换

原码、反码、补码

		正数的原码==正数的反码==正数的补码==正数本身所对应的二进制数
		负数的原码等于==负数本身所对应的二进制数
		负数的反码==负数本身所对应的二进制数各位取反
		负数的补码==反码+1

例子

正数如 50000 :
原码为:0000 0000 0000 0000 1100 0011 0101 0000

补码为:0000 0000 0000 0000 1100 0011 0101 0000

负数如-100 :
原码为 : 1000 0000 0000 0000 0000 0000 1100 0100

补码为 : 1111 1111 1111 1111 1111 1111 0011 1100

转换原理

在这里插入图片描述

代码演示

#include<iostream>
#include<bitset>
using namespace std;
int main(){
	unsigned int a=1;
	long long int b=-2;
//	b=a;
	//当a<0时,将a转化为长整型 ;为什么不用整形因为整形的范围太小 
	 //当a转换成为的二进制数不在符号位无数字时满足 
		//当a>0时,b==a; 
	a=b;////当b<0,将b转化为a也是一个很大的数字因为计算机存储数据是补码,所以a=b的补码所对的二进制数无符号位 
		 //当b>0时,a==b;
	if(a<b)	//这里有个隐式转化会把int转换unsigneg
		cout<<"a小于b"<<endl;
	else
		cout<<"a大于b"<<endl; 
	cout<<b<<endl;	
	cout<<a<<endl;   //4294967295
	bitset<32>bs(a);
	cout<<bs<<endl;
}

总结

当unsigned->int 
	//当a<0时,将a转化为长整型 ;为什么不用整形因为整形的范围太小 
	 //当a转换成为的二进制数时1不在符号位时满足 
		//当a>0时,b==a;

当int->unsigned
	a=b;////当b<0,将b转化为a也是一个很大的数字因为计算机存储数	
	据是补码,所以a=b的补码所对的二进制数无符号位 
		 //当b>0时,a==b;
无论是转化为int->unsigned还是unsigned->int
都是一样的操作就是先转化为补码,然后把补码赋给需要转换的类型
例如 unsigned i=-1;
补码:1111 1111 1111 1111 1111 1111 1111 1111
int b=i;
等价b=1111 1111 1111 1111 1111 1111 1111 1111;
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值