C语言的整形提升规则


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

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


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


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


//下面演示一下字符类型的数据相加的计算过程
int main() {
    char a = 5;

    //如果a为int(四个字节)类型,那补码为:00000000000000000000000000000101
    //但是目前a为char(一个字节)类型,只能截断存储补码为:00000101

    char b = 126;
    //如果b为int(四个字节)类型,那补码为:00000000000000000000000001111110
    //但是目前b为char(一个字节)类型,只能截断存储补码为:01111110

    char c = a + b;
    //当a和b遇到操作符时,会整形提升,此时
    //a的补码变为:00000000000000000000000000000101
    //b的补码变为:00000000000000000000000001111110
    //相加之后c为:00000000000000000000000010000011
    //但是目前是int类型,最后存入c时又要变成char类型:10000011

    printf("%d\n", c);
    //这里要把c提升为整数并打印出来
    //所以按照填充符号位的规则变为:11111111111111111111111110000011
    //补码就是:11111111111111111111111110000011
    //反码就是:11111111111111111111111110000010
    //原码就是:10000000000000000000000001111101-> -125
  
 return 0;
}

相关推荐

  1. C语言整形提升规则

    2024-01-19 18:16:03       52 阅读
  2. C语言整形提升举例说明

    2024-01-19 18:16:03       31 阅读
  3. HJ9 提取不重复整数C语言

    2024-01-19 18:16:03       56 阅读
  4. [C++] Makefile语法规则

    2024-01-19 18:16:03       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-19 18:16:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-19 18:16:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-19 18:16:03       82 阅读
  4. Python语言-面向对象

    2024-01-19 18:16:03       91 阅读

热门阅读

  1. [力扣 Hot100]Day8 无重复字符的最长子串

    2024-01-19 18:16:03       59 阅读
  2. 【力扣每日一题】力扣2171拿出最少数目的魔法豆

    2024-01-19 18:16:03       60 阅读
  3. leetcode—和为K的子数组

    2024-01-19 18:16:03       55 阅读
  4. 问题解决方案

    2024-01-19 18:16:03       59 阅读
  5. npm install 太慢?解决方法

    2024-01-19 18:16:03       60 阅读
  6. git merge 和 git pull的区别是什么

    2024-01-19 18:16:03       48 阅读
  7. Github Copilot 的使用方法和快捷键

    2024-01-19 18:16:03       71 阅读
  8. 公司OA办公系统使用阿里云服务器怎么选配置?

    2024-01-19 18:16:03       60 阅读
  9. Linux常用命令

    2024-01-19 18:16:03       47 阅读
  10. Spring Boot3 系列:Spring Boot3 跨域配置 Cors

    2024-01-19 18:16:03       35 阅读
  11. 《设计模式的艺术》笔记 - 享元模式

    2024-01-19 18:16:03       49 阅读
  12. C语言中各变量声明及注意事项

    2024-01-19 18:16:03       56 阅读