整形提升详解

简介: 整形提升详解

整形提升详解

1.什么是整形提升

2.为什么会有整形提升

3.如何进行整形提升呢?

4.整形提升的例子

例1

例2

例3

例4

例5

1.什么是整形提升


表达式中的字符和短整形操作数在使用之前被转换成普通整形int,这种转换叫做整形提升


整形提升针对的类型小于整形的char,short


char占用1字节空间,short占用2字节空间,在运算时都会提升为占用4个字节的int类型


所以C的整型算术运算总是至少以缺省整型类型的精度来进行的。换而言之整形算术运算都至少以int类型计算的


2.为什么会有整形提升


表达式的整形运算要在CPU的相应运算器内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。


通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。


因此,即使两个char类型的变量相加,在·CPU执行时实际上也要先转化为CPU内整型操作数的标准长速度。


3.如何进行整形提升呢?


整形提升是按照变量的数据类型的符号位来提升的

负数的整形提升:


char c1 = -1,char类型占1字节,也就是它的二进制补码只有8个比特位 :1111111

因为char是有符号位的char,所以整形提升的时候,高位补符号位1

提升之后的效果为:11111111111111111111111111111111


正数的整形提升:


char c2 = 1;

变量c2的二进制位(补码)中只有8个比特位:

00000001

因为 char 为有符号的 char

所以整形提升的时候,高位补充符号位,即为0

提升之后的结果是:

00000000000000000000000000000001


无符号的整形提升:高位补0


4.整形提升的例子


例1

#include<stdio.h>
int main()
{
  char a = 3;
  char b = 127;
  char c = a + b;
  printf("%d\n", c);
  return 0;
}
1


char a = 3,首先把3放到a中,3是int类型,3的二进制序列为:00000000000000000000000000000011

需要把3放到char中,int是32个比特位,char是8个比特位,所以接下来需要进行截断:将低8个比特位放到char中,所以此时a中为: 00000011


char b = 127也是一样

127为00000000000000000000000001111111

截断为011111111


char c = a + b,接下来要进行整型提升

当前char为有符号的char,所以对于a就高位补0,为:00000000000000000000000000000011

同理,b整形提升后为:00000000000000000000000001111111


接下来相加为00000000000000000000000010000010,将这个32位二进制放到c中,截断为10000010


printf("%d\n", c)中,%d是打印十进制的数,所以还需整形提升,此时c为10000010,符号位为:1,整形提升高位补1,最终为11111111111111111111111110000010(补码),其原码为10000000000000000000000001111110 ,所以这个数字输出为-126


输出结果:

db1391a6195140b7bb50639b74c95704.png


例2

int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
  printf("a");
if(b==0xb600)
  printf("b");
if(c==0xb6000000)
  printf("c");
return 0;
}


比较也是表达式,a,b也要发生整形提升,所以只有c不会整形提升,所以输为c


输出结果


9b4895a1dff547ea8de985a5b3fe4d7d.png

这个例子能体现整形提升的存在


例3

int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}


c是char类型,sizeof(c)值为1

+c.-c中,c都参与计算,所以整形提升为int类型,sizeof(+c),sizeof(-c)值都为4


输出结果:

f7631abf31dc427fa67255814c8e32f3.png


这个例子也能体现整形提升的存在


例4

下面程序输出什么?

#include <stdio.h>
int main()
{
  char a = -128;
  printf("%u\n",a);
  return 0;
}


10000000000000000000000010000000 -128原码

11111111111111111111111101111111 -128反码

11111111111111111111111110000000 -128补码

截断 10000000 a

整形提升11111111111111111111111110000000

所以最后输出11111111111111111111111110000000对应的十进制数,是一个很大的数

例5

下面程序输出什么?


#include <stdio.h>
int main()
{
  char a = 128;
  printf("%u\n",a);
  return 0;
}

7

10000000000000000000000010000000 128补码

截断:10000000 a补码

整形提升:11111111111111111111111110000000

所以最后输出11111111111111111111111110000000对应的数,一个很大的数

整形提升是真实存在的,但是我们平时感觉不到他的存在

其他操作符如int,float,double等大于等于int的操作符,之间的转换,就要用到算术转换了


目录
相关文章
|
存储 算法 编译器
【c 语言 】移位操作符详解
【c 语言 】移位操作符详解
734 0
|
存储 大数据 数据安全/隐私保护
Python中的长整型
Python中的长整型
302 0
|
12月前
|
机器学习/深度学习 存储 分布式计算
未来趋势:探索GraphRAG在大规模异构网络环境下的挑战与机遇
【10月更文挑战第11天】随着互联网和物联网技术的快速发展,数据不仅数量庞大,而且类型多样,形成了复杂的大规模异构网络。这些网络中包含了不同类型的节点(如文本、图像、视频等)以及它们之间的多种关系。如何有效地处理这种大规模异构网络,以便进行内容理解与生成,是当前研究的一个热点问题。Graph Retrieval-Augmented Generation (GraphRAG) 框架作为一种新兴的方法,在这一领域展现出了巨大的潜力。本文将深入探讨GraphRAG的基础理论、构建方法,并分析其在未来大规模异构网络环境下的挑战与机遇。
617 3
|
11月前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
机器学习/深度学习 算法
【机器学习】P问题、NP问题、NP-hard、NP-C问题解析与举例理解
本文解析了P问题、NP问题、NP-hard问题以及NP-Complete问题的概念,并通过实例帮助理解NP问题的特点和复杂性。
3490 1
|
Java Linux
Linux通配符的使用方法
Linux通配符的使用方法
|
IDE 测试技术 开发工具
|
存储 C++ 索引
C++中的string容器及字符串拼接操作讲解
C++中的string容器及字符串拼接操作讲解
600 3
|
Linux 开发工具
蓝易云 - 在CentOS7/RHEL7上安装OpenSSL1.1.x教程
以上就是在CentOS7/RHEL7上安装OpenSSL 1.1.x的步骤。希望对你有所帮助。
684 0
|
Java 程序员 编译器
【C/C++析构函数 】C++中的“垃圾回收”机制_析构
【C/C++析构函数 】C++中的“垃圾回收”机制_析构
246 0