1.整型提升是什么
cpu难以实现8比特位的直接相加计算,所以小于int长度的类型都要转换成int类型,再送到CPU内计算。
小于int的就是:char 一字节,short 两字节
在学习整型提升之前要了解:
1 .整型在内存的是以补码形式存放的
2.正数的 原码=反码=补码
3.负数的 原码——反码=(原码的符号位不变,其他位按位取反)——补码=(反码+1)
2.如何进行整型提升
1. 负数的整型提升
char a=-2; char字符串类型占一个字节。
整型提升的步骤:
1.-2=10000000 00000000 00000000 00000010(原码)
=111111111 11111111 11111111 11111101(反码)
=11111111 11111111 11111111 11111110(补码)
2.截断:char字符串类型占一个字节
=(11111111 11111111 11111111)截断 11111110 留一个字节
=11111110
3.看他的类型是什么,他是char类型的,是一个有符号的。
4.看他截断后的符号位 11111110 是1,表示负数,前面补1.
5.整型提升后=11111111 11111111 11111111 11111110
2.正数的整型提升
char a=2;
整型提升的步骤:
1.2=00000000 00000000 00000000 00000010(原码)=(反码)=(补码)
2.截断:char字符串类型占一个字节 。
=(00000000 00000000 00000000)截断 00000010 留一个字节
=00000010
3.看他的类型是什么,他是char类型的,是一个有符号的。
4.看他截断后的符号位 00000010 是0,表示正数,前面补0.
5.整型提升后=00000000 00000000 00000000 00000010
3.整型提升实战
#include<stdio.h>
int main()
{
char a=3;
char b=-127;
char c=a+b;
printf("%d",c);
return 0
}
1.a=3
a=00000000 00000000 00000000 00000011(二进制表示形式)(补码)
2.截断:a=00000011
3.char 是有符号的,再看符号位,符号位是0,是正数,补0.
4.a整型提升后=00000000 00000000 00000000 00000011
1.b=-127
b=10000000 00000000 00000000 01111111 (二进制表示形式)(原码)
b=11111111 11111111 11111111 10000000(反码)
b=11111111 11111111 11111111 10000001(补码)
2.截断:b=10000001
3.char 是有符号的,再看符号位,符号位是1,是负数,补1.
4.a整型提升后=11111111 11111111 11111111 10000001
1.c=a+b=
a=00000000 00000000 00000000 00000011
+
b=11111111 11111111 11111111 10000001
2.c=a+b=11111111 11111111 11111111 10000100
3.截断:c=10000100
4.char 是有符号的,再看符号位,符号位是1,是负数,补1.
5.整型提升后c=11111111 11111111 11111111 10000100
6.现在看输出什么%d,int 有符号的。看符号位,符号位为1,是负数。整数在内存中是以补 码形式存放的,所以要把补码转换成原码输出。
7.c=11111111 11111111 11111111 10000100(补码)
8.c=11111111 11111111 11111111 10000011(反码)
9.c=10000000 00000000 00000000 01111100(原码)
10.c=-124
3.总结
1.公式
类型(x) 名(a) = 数 (y); 输出% (z)
1.先看y : 如果y是正数 — 原码=反码=补码
如果x是负数 — 原码 转 反码 转 补码
2.根据x截断: x是char占一个字节,就截断一个。
x是short占俩个字节,就截断俩个。
3.看x是什么类型的然后再整型提升 :
char || signed (有符号的) — 看符号位,正的补0,负的补1.
unsigned (无符号的) — 不用管
4.看输出%z:
如果输出的是有符号的—看符号位,符号位是1,是负数,补码 转 反码 转 原码 输出
如果输出的是无符号的—直接输出