C语言——隐式转换

简介: 这里小编给大家简单的补充一下,一些有关C语言的知识点

前言

这里小编给大家简单的补充一下,一些有关C语言的知识点


隐式转换

由于转换形式的不同类型转换这里一共分为整型提升和运算转换两种形式


1.整型提升

在了解整型提升之前,这里我们需要先了解一下截断这个概念,对于截断操作,这里我举个例子给大家简单的说明一下


这里我们举一个例子,这里char a=1,但是对于char存储的大小仅仅只是8字节,那么对于常量1,这里却是一个整型,占了32字节,那么为了存储这个变量我们这里就会发生截断操作,对于截断的规则如下:从低位开始,选取处该需要存储的字节大小。


也即是:



所以存储在变量a中也就是0 0  0 0  0 0 0 1。


那么整型提升又是什么呢?


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


整型提升的意义:

1.表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。

2.通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转

换为int或unsigned int,然后才能送入CPU去执行运算。


那么对于整型提升的具体过程又是怎么的呢?


这里我们以char类型给大家简单演示一下:



大家可能平时会见到这样的代码:


int main()
{
  char a = 127;
  char b = 3;
  char c = a + b;
  printf("%d", c);
  return 0;
}

这里我们先直接看结果:



大家都知道有符号得char类型得表示范围是-127~128,那么这里就不会出现存储130值的char类型,那么该又是怎么得到-126这个值的呢?


这里其实就发生了整型提升和截断的两个过程


首先我们进行运算就需要进行整型提升:


127的补码如下:


01111111


进行整型升后得到的是


00000000000000000000000001111111


3的补码是


00000011


整型提升后的值是:


00000000000000000000000000000011


然后我们把整型提升后的值进行相加得到:


00000000000000000000000010000010.


然后我们需要将其存入c,因为c是char类型,所以这里我们要对其进行截断操作,那么我们得到c的补码是:10000010。


然后我们对其进行打印操作,由于我们是将其按整型的形式打印出来,所以这里我们要进行整型提升,也就得到:11111111111111111111111110000010.


由于该是负数,这里我们就需要将其转化为原码输出,所以这里我们转换成原码后得到


10000000000000000000000001111110.


所以这里按二进制转十进制后,得到的值是:-126.


2.算数转换

对于小于整型的情况我们使用的是整型提升的方式,但是对于大于int的类型,我们采用的是算数转换的方式。那么对于算数转换的规则是:

int->unsigned int->long int->unsigned long int->float->double->long double


这里给大家简单举一个例子,这里我们使用到sizeof函数,这里有一点我们需要注意的是sizeof的返回值是unsigned int,那么下面我们直接看代码

int main()
{
  int i = -1;
  if (i < sizeof(i))
  {
  printf("haha");
  }
  else
  {
  printf("hehe");
  }
}

这里如果没有隐式转换,那么我们得到的值应该是haha,但是由于我们 i变量发生了隐式转换,遂于-1的无符号数,该是特别大的,所以我们这里的打印值应该是呵呵。


这里我们看运行结果:

相关文章
|
6月前
|
编译器 测试技术 C语言
【C语言航路外传】隐式转换与优先级的那点事(你程序总是出bug的一个重要原因)
【C语言航路外传】隐式转换与优先级的那点事(你程序总是出bug的一个重要原因)
52 0
|
存储 C语言
【C语言】隐式转换
本文讲解:C语言中的隐式转换。
|
5天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
4天前
|
C语言
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
18 0
|
4天前
|
C语言
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
5 0
|
4天前
|
C语言
C语言——函数递归
C语言——函数递归
5 0
|
4天前
|
C语言
C语言—函数(大化小方式的心脏)
C语言—函数(大化小方式的心脏)
4 0
|
5天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
16 2
|
5天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
5天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)