C语言强制类型转换

什么是强制类型转换?

强制类型转换是把变量从一种类型转换为另一种数据类型;

强制转换有两种类型:

  • 显示强制转换,由开发人员强制指定, 如 (int)1.0
  • 隐式强制转换,由编译器执行

C 显示类型强制转换

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int x = 5;
    int y = 10;
    float rs = (float)x / y;

    printf("float value = %lf", rs);
    return 0;
}

运行结果为

float value = 0.500000

这种方式 就是通过 在要强制转换的类型添加 () 就可以了

C 隐式类型强制转换

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{

    int x = 3;
    float y = 5.5;

    float rs1 = x + y;
    int rs2 = x + y;

    printf("rs1 = %f \n", rs1);
    printf("rs2 = %d", rs2);
    return 0;
}

运行结果为

rs1 = 8.500000
rs2 = 8
  • rs1 = 8.500000 是因为我拉接收结果为float 类型,所以编译器就隐式的把结果强制转换为float类型,
  • rs2 = 8 是因为我拉接收结果为 int 类型,所以编译器就隐式的把结果强制转换为int类型,当然这过程会丢失精度, 其原因是由于int 类型的空间占用小于float类型

C 整数提升

整数提升是指把小于 int 或 unsigned int 的整数类型转换为 int 或 unsigned int 的过程。

示例如下,在 int 中添加一个字符:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MIN(x, y) ((x)<(y)?(x):(y))

int main()
{

    int  x = 2;
    char p = 'p'; /* ascii 值是 112 */
    int sum = x + p;

    printf("x + p = %d\n", sum );

    return 0;
}

运行结果为

x + p = 114
二进制 十进制 十六进制 图形
0010 0000 32 20 (空格)(␠)
0010 0001 33 21 !
0010 0010 34 22 "
0010 0011 35 23 #
0010 0100 36 24 $
0010 0101 37 25  %
0010 0110 38 26 &
0010 0111 39 27 '
0010 1000 40 28 (
0010 1001 41 29 )
0010 1010 42 2A *
0010 1011 43 2B +
0010 1100 44 2C ,
0010 1101 45 2D -
0010 1110 46 2E .
0010 1111 47 2F /
0011 0000 48 30 0
0011 0001 49 31 1
0011 0010 50 32 2
0011 0011 51 33 3
0011 0100 52 34 4
0011 0101 53 35 5
0011 0110 54 36 6
0011 0111 55 37 7
0011 1000 56 38 8
0011 1001 57 39 9
0011 1010 58 3A :
0011 1011 59 3B ;
0011 1100 60 3C <
0011 1101 61 3D =
0011 1110 62 3E >
0011 1111 63 3F ?
 
二进制 十进制 十六进制 图形
0100 0000 64 40 @
0100 0001 65 41 A
0100 0010 66 42 B
0100 0011 67 43 C
0100 0100 68 44 D
0100 0101 69 45 E
0100 0110 70 46 F
0100 0111 71 47 G
0100 1000 72 48 H
0100 1001 73 49 I
0100 1010 74 4A J
0100 1011 75 4B K
0100 1100 76 4C L
0100 1101 77 4D M
0100 1110 78 4E N
0100 1111 79 4F O
0101 0000 80 50 P
0101 0001 81 51 Q
0101 0010 82 52 R
0101 0011 83 53 S
0101 0100 84 54 T
0101 0101 85 55 U
0101 0110 86 56 V
0101 0111 87 57 W
0101 1000 88 58 X
0101 1001 89 59 Y
0101 1010 90 5A Z
0101 1011 91 5B [
0101 1100 92 5C \
0101 1101 93 5D ]
0101 1110 94 5E ^
0101 1111 95 5F _
 
二进制 十进制 十六进制 图形
0110 0000 96 60
0110 0001 97 61 a
0110 0010 98 62 b
0110 0011 99 63 c
0110 0100 100 64 d
0110 0101 101 65 e
0110 0110 102 66 f
0110 0111 103 67 g
0110 1000 104 68 h
0110 1001 105 69 i
0110 1010 106 6A j
0110 1011 107 6B k
0110 1100 108 6C l
0110 1101 109 6D m
0110 1110 110 6E n
0110 1111 111 6F o
0111 0000 112 70 p
0111 0001 113 71 q
0111 0010 114 72 r
0111 0011 115 73 s
0111 0100 116 74 t
0111 0101 117 75 u
0111 0110 118 76 v
0111 0111 119 77 w
0111 1000 120 78 x
0111 1001 121 79 y
0111 1010 122 7A z
0111 1011 123 7B {
0111 1100 124 7C |
0111 1101 125 7D }
0111 1110 126 7E ~

C 算术转换

提升顺序由小到大:

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

示例如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int  x = 10;
    char p = 'p'; /* ascii 值是 112 */
    int sum = x + p;

    printf("x + p = %d\n", sum );

    return 0;
}

运行结果为

x + p = 122

它是如何得到122 ?

关键在于 int sum = x + p; 因为我们定义结果为int 类型, 而p 为 char 类型, 所以此时编译器会把p进行算术转换,等到p = 112, 然后再运行 加法运算!