C语言整形提升举例详解

 更新时间:2023年01月09日 11:15:55   作者:Jambo!  
对于整形提升,高位需要补位,那么补什么呢,无符号数高位补0,有符号数高位补1,下面这篇文章主要给大家介绍了关于C语言整形提升的相关资料,需要的朋友可以参考下

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 = -1char类型占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;
}

char a = 3,首先把3放到a中,3是int类型,3的二进制序列为:00000000000000000000000000000011
需要把3放到char中,int是32个比特位,char是8个比特位,所以接下来需要进行截断:将低8个比特位放到char中,所以此时a中为: 00000011

char b = 127也是一样
12700000000000000000000000001111111
截断为011111111

char c = a + b,接下来要进行整型提升
当前char为有符号的char,所以对于a就高位补0,为:00000000000000000000000000000011
同理,b整形提升后为:00000000000000000000000001111111

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

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

输出结果:

例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

输出结果

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

例3

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

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

输出结果:

请添加图片描述

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

例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;
}
  • 10000000000000000000000010000000 128补码
  • 截断:10000000 a补码
  • 整形提升:11111111111111111111111110000000
  • 所以最后输出11111111111111111111111110000000对应的数,一个很大的数

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

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

总结

到此这篇关于C语言整形提升的文章就介绍到这了,更多相关C语言整形提升内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 详解安卓系统中的Android.mk文件

    详解安卓系统中的Android.mk文件

    这篇文章主要介绍了详解安卓系统中的Android.mk文件,该文件用来告诉系统关于源代码的编译,需要的朋友可以参考下
    2015-07-07
  • C语言每日练习之冒泡排序

    C语言每日练习之冒泡排序

    这篇文章主要介绍了C语言冒泡排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • Qt 编译配置 Protobuf 的详细步骤

    Qt 编译配置 Protobuf 的详细步骤

    在Qt项目中使用Protobuf(Protocol Buffers)可以有效地处理数据序列化和反序列化,以下是如何在Qt项目中配置和编译Protobuf的详细步骤,感兴趣的朋友一起看看吧
    2024-07-07
  • C C++算法题解LeetCode1408数组中的字符串匹配

    C C++算法题解LeetCode1408数组中的字符串匹配

    这篇文章主要为大家介绍了C C++算法题解LeetCode1408数组中的字符串匹配示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • C语言实现旅游景点咨询系统

    C语言实现旅游景点咨询系统

    这篇文章主要为大家详细介绍了C语言实现旅游景点咨询系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C语言 sizeof关键字的具体使用

    C语言 sizeof关键字的具体使用

    在C语言中,sizeof是一个非常常用的关键字,本文主要介绍了C语言 sizeof关键字的具体使用,包括sizeof 关键字的语法、用法、特点和注意事项,感兴趣的可以了解一下
    2024-02-02
  • 利用C语言实现顺序表的实例操作

    利用C语言实现顺序表的实例操作

    顺序表是线性表中的一种重要的数据结构,也是最基础的数据结构,所以他不仅是学习中的重点,也是应用开发非常常用的一种数据结构。这篇文章介绍如何利用C语言实现顺序表。
    2016-08-08
  • C++中四种对象生存期和作用域以及static的用法总结分析

    C++中四种对象生存期和作用域以及static的用法总结分析

    以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • C++实现图形界面时钟表盘代码

    C++实现图形界面时钟表盘代码

    这篇文章主要介绍了C++实现图形界面时钟表盘代码,涉及坐标函数的应用及图形界面程序设计,需要的朋友可以参考下
    2014-10-10
  • C++算法学习之回溯法的应用

    C++算法学习之回溯法的应用

    这篇文章介绍了C++算法中回溯法的一些应用,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论