C语言入门:强制类型转换

强制类型转换是把变量从一种类型转换为另一种数据类型。例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型。

如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示

C 语言中 printf 输出 double 和 float 都可以用 %f 占位符 可以混用,而 double 可以额外用 %lf

而 scanf 输入情况下 double 必须用 %lf,float 必须用 %f 不能混用。

为了提高效率,C 语言对于不同的两个类型将直接转换成较高类型计算。

举个例子:对于已经分别被定义且被赋值,类型为 doubleintab

假设如果进行 a + b 运算,那么b将直接被隐式转换为 double 类型,然后再进行运算,不能理解为逐层转换(即不能理解为b先转换为unsigned int类型,再转换为 long => unsigned long => long long => unsigned long long => float => double类型,最后再进行运算)。

p.s: 说到运算,对于 charshort 类型,进行运算时将会被隐式转换为 int,看代码:

#include <stdio.h>

int main() {
  char c = 22, ch = 33;
  short m = 23, n = 32;
  printf("%d\n", sizeof(c + ch));  //char和char类型的运算
  printf("%d\n", sizeof(m + n));   //short和short类型的运算
  printf("%d", sizeof(m + ch));    //short和char类型的运算
  return 0;
}

输出:

4
4
4

这里没讲,顺带补充一下转换规则:

1、float、double、long double 类型赋值给整数类型:直接截断小数

如:

#include <stdio.h>

int main() {
  float a = 3.8;
  int b = a;  //进行了一次隐式类型转换
  printf("a=%.2f; b=%d", a, b);
  return 0;
}

根据转换规则和隐式类型转换规则,输出的结果为:

a=3.80; b=3

2、整数类型赋值给浮点数(float、double、long double)类型:补足有效小数位

对上述代码进行修改:

#include <stdio.h>

int main() {
  int a = 8;
  float b = a;  //进行了一次隐式类型转换
  printf("a=%d; b=%f", a, b);
  return 0;
}

输出:

a=8; b=8.000000  //%f默认输出6位小数

3、存储长度较短的类型赋值给存储长度较长的类型:补足有效位,其它位补 0

假设有如下定义:

char c = 56;
short num = 67;
int m;
long long int n;

如果执行以下操作:

m = ((int)c);
n = ((long long)num);

那么它们在内存以 2 进制格式分别存储为:

                           00111000  //Binary of 'c'
                                                      00000000 01000011  //Binary of 'num'
                                    00000000 00000000 00000000 00111000  //Binary of 'm'
00000000 00000000 00000000 00000000 00000000 00000000 00000000 01000011  //Binary of 'n'

4、存储长度较长

的类型赋值给存储长度较短的类型:舍弃高位(但保留符号),截断低字节给存储长度较短的类型

假设定义:

long long int l = 223372036854775807;

进行赋值:

int i = (int)l;

它们在内存以2进制格式分别存储为:

00000011 00011001 10010011 10101111 00011101 01111011 11111111 11111111  //Binary of 'l'
                                    00011101 01111011 11111111 11111111  //Binary of 'v'

p.s: 此时的 v=494665727。

顺带说明一下,如果变量 “l” 的后 32 个字节都为 1,那么 v 将等于 -1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰度少爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值