在机器里整形的数据都是补码的形式
有符号转无符号
#include <stdio.h>
int main()
{
//计算机里的数据都是补码的形式
short a = 8; //等价于:short int a = 8; 短整型,2字节。
//原码:0,000 0000 0000 1000 补码:0,000 0000 0000 1000
unsigned short ua = (unsigned short)a; //无符号数
//0000 0000 0000 1000 无符号数直接解读为真值8
printf("a = %d, ua = %u \n", a, ua); //真值依然为8
short b = -8;
//原码:1,000 0000 0000 1000 补码:1,111 1111 1111 1000
unsigned short ub = (unsigned short)b;
//机器内部数:1111 1111 1111 1000 无符号数直接解读为真值65528
printf("b = %d, ub = %u \n", b, ub);
return 0;
}
a = 8, ua = 8
b = -8, ub = 65528
负数的机器码(补码)如果直接解读为无符号数(包括符号位)的记忆方法:
设负数真值为-a,机器字长n位
那么转换为无符号数的真值就是2^n-a
无符号转有符号
#include <stdio.h>
int main()
{
unsigned short ux = 65528;
short x = (short)ux;
printf("ux = %u, x = %d \n", ux, x);
return 0;
}
ux = 65528, x = -8
大字长转小字长
#include <stdio.h>
int main()
{
int x = 2147483647;
//原码:0,111 1111 1111 1111 1111 1111 1111 1111
//补码:0,111 1111 1111 1111 1111 1111 1111 1111
short sx = (short)x;
//舍弃高位后的机器数为:1,111 1111 1111 1111
//转为原码:1,000 0000 0000 0001 真值为-1
printf("x = %d, sx = %d", x, sx);
return 0;
}
x = 2147483647, sx = -1
小字长转大字长
#include <stdio.h>
int main()
{
short sx = -1;
//原码:1,000 0000 0000 0001
//机器数(补码):1,111 1111 1111 1111
int x = (int)sx;
//有符号数进行符号扩展:扩展后的高位部分用原数符号位填充
//扩展后的机器数为:1,111 1111 1111 1111 1111 1111 1111 1111
//原码:1,000 0000 0000 0000 0000 0000 0000 0001
printf(" sx = %d, x = %d\n", sx, x);
short sa = 1;
//原码:0,000 0000 0000 0001
//机器数(补码):0,000 0000 0000 0001
int a = (int)sa;
//扩展后的机器数为:0,000 0000 0000 0000 0000 0000 0000 0001
printf(" sa = %d, a = %d\n", sa, a);
//无符号数进行0扩展,与有符号正数是一样的
unsigned short sb = 1;
//机器数:0000 0000 0000 0001
int b = (int)sb;
//扩展后的机器数为:0000 0000 0000 0000 0000 0000 0000 0001
printf(" sb = %d, b = %d", sb, b);
return 0;
}
sx = -1, x = -1
sa = 1, a = 1
sb = 1, b = 1