c语言整型提升

c语言中整型算术运算总是至少以缺省整型(缺省整型(通常指int类型) :这是 C 语言中整数类型的默认基准,int的大小由编译器和系统架构决定(通常为 32 位,可存储范围约 ±21 亿),它是整型运算的 "基准精度"。)的精度来进行的

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型

这种转换称为整型提升

如何整型提升

1.有符号整型提升是按变量的数据类型的符号位来提升的

2.无符号位提升,高位补0

cpp 复制代码
#include <stdio.h>
int main()
{
	//运算前 ------a和b自动进行整型提升(转为int类型)
	char a = 3;//char--signed char
	//a=00000011(char只有八个比特位)
	char b = 127;//01111111=b
	//a = 3(0000 0011):符号位为 0,提升为int后,高位填充 24 个 0,结果为 0000 0000 0000 0000 0000 0000 0000 0011(十进制仍为 3)。
	//b = 127(0111 1111):符号位为 0,提升为int后,高位填充 24 个 0,结果为 0000 0000 0000 0000 0000 0000 0111 1111(十进制仍为 127)。
	//运算中 ------ 以int类型精度执行加法运算
	char c = a + b;
	//a+b=130=0000 0000 0000 0000 0000 0000 1000 0010
	//运算后 ------ 将int类型结果隐式转换为char类型(赋值给c)
	printf("%d\n", c);
	return 0;
}

整型提升是 "运算过程中" 的精度保证,运算完成后,由于要将结果赋值给char类型变量c,会发生隐式类型转换(截断转换),这一步与整型提升无关,是赋值阶段的类型适配:

  1. char仅占 8 位,因此会将 32 位int结果130的低 8 位截断保留,丢弃高位的 24 个 0。
  2. 截断后得到 8 位二进制:1000 0010(这是c的存储值,占 1 字节)。
  3. 由于c是signed char,存储的是补码,需要解析补码得到实际值:
    • 补码取反(所有位取反):

      补码:1111 1111 1111 1111 1111 1111 1000 0010

      取反:0000 0000 0000 0000 0000 0000 0111 1101

    • 加 1:
      0111 1101 + 1 = 0111 1110

      所以绝对值部分是 0000 0000 0000 0000 0000 0000 0111 1110。

    • 加上符号位(负数):
      1 000 0000 0000 0000 0000 0000 0111 1110

      符号位是第 1 位(1 表示负),其余 31 位是 0...01111110

    • 所以最后c等于-126而不是130

相关推荐
唐青枫14 分钟前
C 语言 strcpy() 用法详解与实战 Demo
c语言
SomeOtherTime43 分钟前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔1 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆1 小时前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言
Hvitur2 小时前
Java - Lambda
java·开发语言·python
xiaoye-duck2 小时前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
Evand J2 小时前
【MATLAB例程,PMSM19】永磁同步电机(PMSM)基于多速率无迹卡尔曼滤波(UKF)的转速与转子位置估计。测量缺失、状态预测与恢复性能分析
开发语言·matlab·电机·ekf·卡尔曼·电机滤波
喵了几个咪3 小时前
GoWind Flow 拆解:一个 Go 工作流引擎与它的双模式设计器
开发语言·人工智能·后端·golang
꧁细听勿语情꧂3 小时前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法
是main不是漫3 小时前
【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基
c语言·开发语言·c++