机器内部的记录方式
对于无符号数,机器内部所有的二进制编码直接表示这个数字,对于有符号数,机器内部的二进制编码第一位是代表符号,0为正1为负,后面的编码才是真正的数值。
无符号数转有符号数的过程
机器会先判断无符号数的最高位,如果是0,那么就直接转换过去了,不做改动;
如果最高位是1,机器会将无符号数取它的补码当作有符号数。
补码是什么?(原码, 反码, 补码的概念)
原码
就是符号位加数值,相当于有符号数的机器内部编码;
反码
正数的反码就是本身;
负数的反码是 符号位不变,其余各个位取反;
补码
正数的补码就是本身;
负数的补码在反码基础上+1;
例如:
无符号数42486对应的二进制数为:1010010111110110;
在转成有符号数的时候,机器判断第一位不是0,所以取其补码,为1101101000001010;
补码直接当做有符号数的编码,那么第一位代表符号“-”,剩下的是代表数值,转成二进制就是23050;
所以输出的是-23050
#include <iostream>
using namespace std;
int main(){
int i=42486;
cout<<"16进制:"<<hex<<i<<endl<<"八进制:"<<oct<<i<<endl ;
unsigned short int a=42486;
cout<<"无符号转有符号输出:"<<dec<<short(a) <<endl;
return 0;
}