当前位置:网站首页 > 技术博客 > 正文

c语言如何进行强制类型转换



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

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

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

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

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

输出:

4 4 4

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

如:

#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

对上述代码进行修改:

#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位小数

假设有如下定义:

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

如果执行以下操作:

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

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

 00 //Binary of 'c' 00000000 0 //Binary of 'num' 00000000 00000000 00000000 00 //Binary of 'm' 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0 //Binary of 'n'

假设定义:

long long int l = ;

进行赋值:

int i = (int)l;

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

00000011 00011001   00011101 0   //Binary of 'l' 00011101 0   //Binary of 'v'

p.s: 此时的 v=。

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

注意:如果 unsigned 类型储存的量太大,强制类型转换后可能会出现非 unsigned 类型的值的绝对值不等于 unsigned 类型的值的绝对值的情况。

说到 “unsigned 类型储存的量太大”,顺带说一下,虽然 printf 输出 int 和 unsigned int 时可以混用 %d(或%i)和 i),但还是建议输出 int 类型的时候用 %d(或%i),输出 unsigned int 类型时用 i)(其它类型同理<如愠t;)

看一个例子:

#include <stdio.h> int main() { unsigned int x = ; //这个数字为(2^32)-1, 而int类型最大存储数字的值为(2^31)-1 int y = ((int)x); printf("signed of x=%d", x); //这里有一次隐式类型转换(unsigned int => int) putchar(' '); printf("unsigned of x=薥 x); printf("signed of y=%d", y); return 0; }

可是因为隐式类型转换,结果输出为:

-1  -1

出现“-1”的这个输出就是因为“unsigned类型储存的量太大(大于了同类型但非unsigned的类型)”

p.s: 不一定都为 -1,具体要看 unsigned 类型的值的 2 进制

给个小技巧:如果你想“临时”给一个不知道正负的非 unsigned 类型的变量加上绝对值,可以使用abs函数,但利用(unsigned)(非unsigned类型变量名)可以节省一点内存开销

但是也有弊端:可能会出现 unsigned-unsigned 永远大于 0 的情况(不确定)

最后补充一下,强制类型转换只是临时类型转换,并不影响变量本身储存的值,看如下代码:

#include <stdio.h> int main() { float a = 6.9; printf("%.3f", a); putchar(' '); ((int)a); printf("%.3f", a); return 0; }

输出结果:

6.900 6.900

版权声明


相关文章:

  • xcp和tcp的区别2025-03-08 15:29:59
  • .pyd文件2025-03-08 15:29:59
  • copysign python2025-03-08 15:29:59
  • 白色实心五角星符号2025-03-08 15:29:59
  • echarts常用方法2025-03-08 15:29:59
  • 软件测试自动化测试2025-03-08 15:29:59
  • 记录键盘鼠标操作的软件2025-03-08 15:29:59
  • 这儿真美三年级优秀作文2025-03-08 15:29:59
  • 分布式数据库实验2025-03-08 15:29:59
  • redis 集群模式配置2025-03-08 15:29:59