整形提升.

文章详细介绍了整型提升的概念,即CPU在处理小于int类型的数值时将其转换为int进行计算的过程。内容包括正数和负数的提升步骤,涉及原码、反码和补码的转换,并通过实例展示了截断和符号位处理。最后,文章提供了一个整型提升的实际代码示例,解释了计算结果的输出方式。
摘要由CSDN通过智能技术生成

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,是负数,补码 转 反码 转 原码 输出

       如果输出的是无符号的—直接输出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值