关于整型提升(1)

本文详细解释了C语言中的整型提升概念及其应用。通过具体的示例说明了不同情况下(如正数、负数和无符号整数)的整型提升过程,并展示了如何影响运算结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

注明:以上整形提升的概念与意义均摘抄于网络,并非本人原创

1.负数的整形提升: char c1 = -1; 变量c1的二进制位(补码)中只有8个比特位: 1111111 因为 char 为有符号的 char 所以整形提升的时候,高位补充符号位,即为1 提升之后的结果是: 11111111111111111111111111111111

2.正数的整形提升 :char c2 = 1; 变量c2的二进制位(补码)中只有8个比特位: 00000001 因为 char 为有符号的 char 所以整形提升的时候,高位补充符号位,即为0 提升之后的结果是: 00000000000000000000000000000001

3.无符号整形提升,高位补0

例子(1):
char a=3; char b=127; char c =a+b;应该输出多少呢?
3的补码:00000000 00000000 00000000 00000011
取低八位:00000011

127的补码:00000000 00000000 00000000 01111111
取低八位:011111111

c=a+b;(相加时要提升成整形)
将3整形提升后:00000000 00000000 00000000 00000011(高位补充符号位,为0)
将127整形提升后:00000000 00000000 00000000 01111111(高位补充符号位,为0)
相加后:00000000 00000000 00000000 10000010
取低八位:10000010

将C整形提升:11111111 11111111 11111111 10000010(高位补充符号位,为1)
C的原码:10000000 00000000 00000000 01111110
打印出结果为(-126)

例子(2):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdlio.h>
#include<stdlib.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");  
   system("pause");
   return 0;
 }

a,b要进行整形提升,但是c不需要整形提升 a,b整形提升之后,变成了负数,所以表达式 a0xb6 , b0xb600 的结果是假,但是c不发生整形提升,则表达式 c==0xb6000000 的结果是真.所以程序输出的结果是: c

例子(3):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdlio.h>
#include<stdlib.h>
int main()
 {   
  char c = 1; 
      printf("%u\n", sizeof(c));   
      printf("%u\n", sizeof(+c));   
      printf("%u\n", sizeof(!c));  
      system("pause");
      return 0; 
 }

,c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节.
表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof© ,就是1个字节.

### 整型提升的概念 整型提升(Integral Promotion)是指在某些编程语言中,特别是C语言及其衍生语言中,当操作数参与表达式计算时,较小的整数类型会被自动转换为较大的整数类型。这种机制的主要目的是为了简化运算逻辑并减少潜在的溢出风险[^1]。 具体来说,在C语言中,如果某个表达式的操作数是一个小于`int`大小的整数类型(如`char`、`short`或对应的无符号类型),那么它会先被提升到至少具有`int`类型的宽度后再进行实际计算。这一过程遵循标准定义的行为,并且适用于多种场景,比如算术运算符的应用或者函数调用参数传递的情况。 下面展示了一个简单的例子来说明这个概念: ```c #include <stdio.h> void display_value(int value){ printf("%d\n",value); } int main(){ char c = &#39;A&#39;; short s = 32767; // Integral promotion occurs here. display_value(c); display_value(s); return 0; } ``` 上述代码片段展示了即使变量 `c` 和 `s` 的原始数据类型分别是 `char` 和 `short` ,但在作为实参传给形参为 `int` 类型的函数时发生了隐式的整型提升。 需要注意的是,尽管ANSI C保留了部分早期版本中的特性,但是也做了一些调整使得规则更加严格和统一。 ### 关于Value_per_Weight 计算逻辑 虽然这里主要讨论的是整型提升的内容,但提到的价值重量比(`Value_per_Weight`)通常是用于解决背包问题或其他优化算法情境下的术语[^2]。这与整型提升属于不同领域的话题,但如果涉及到数值处理过程中存在不同类型混合运算,则同样可能触发类似的类型转换现象。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值