整形提升问题

2023-12-18 13:08:07

整形提升问题





一. 概述

??C的整型算术运算总是至少以缺省整型类型的精度来进行的。
??为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。


二. 整型提升的意义

??表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
??因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
??通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。


三. 如何进行整形提升

??整形提升是按照变量的数据类型的符号位来提升的,负数整形提升的时候,高位补充符号位,即为1。正数整形提升的时候,高位补充符号位,即为0。无符号整形提升,高位补0。
??char 到底是signed char还是unsigned char是不确定的,C语言标准没有明确指定,是取决于编译器的。在当前使用的VS上,char == signed char


1. 例子一

#include<stdio.h>
int main()
{
	char a = 5;
	//00000000000000000000000000000101
	//00000101
	char b = 126;
	//00000000000000000000000001111110
	//01111110
	char c = a + b;
	//00000000000000000000000000000101-a
	//00000000000000000000000001111110-b
	//00000000000000000000000010000011
	//10000011-c
	//11111111111111111111111110000011
	//10000000000000000000000001111100
	//10000000000000000000000001111101
	//-125
	printf("%d\n", c);
	return 0;
}

代码运行成功,结果如下:

在这里插入图片描述


2. 例子二

#include<stdio.h>
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不需要整形提升。
??a,b整形提升之后,变成了负数,所以表达式 a0xb6 , b0xb600 的结果是假,但是c不发生整形提升,则表达式 c==0xb6000000 的结果是真。


还有一段代码可以直观的感受到整形提升,代码如下:

3. 例子三

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

运行代码成功,结果如下:

在这里插入图片描述


由此可见,c只要参与表达式运算,就会发生整形提升。



本篇博客为本人学习C语言时的详细笔记,如有错误之处,还望各位指正。
文章为原创,如要转载请注明出处

文章来源:https://blog.csdn.net/m0_59188912/article/details/135055042
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。