整形数据存储形式
在计算机内存里,整数以补码形式存储(正数的补码即原码)。
进制的转换
原码、反码、补码
正数的原码==正数的反码==正数的补码==正数本身所对应的二进制数
负数的原码等于==负数本身所对应的二进制数
负数的反码==负数本身所对应的二进制数各位取反
负数的补码==反码+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;