C 数据类型转换那些事

1-1 数据类型转换


在C语言中,数据类型转换(也称为类型铸造或类型转换)是一个重要的概念,它允许你将一种数据类型的值转换为另一种数据类型。然而,在进行类型转换时,有一些关键点和注意事项需要牢记,以避免潜在的错误和不正确的结果。以下是一些主要的数据类型转换注意事项:


1.0 隐式转换


隐式类型转换(自动转换):

在表达式中,charshort等小整型会被自动提升为intunsigned int可能导致符号扩展问题

#include <stdio.h>

int main() {
    char ch = 'A'; // ASCII value of 'A' is 65
    int i = ch;    // Implicit conversion from char to int
    printf("i = %d\n", i); // Output: i = 65
    return 0;
}

示例:浮点提升

#include <stdio.h>

int main() {
    int a = 5;
    double b = 2.5;
    double result = a + b; // Implicit conversion of 'a' to double
    printf("result = %lf\n", result); // Output: result = 7.500000
    return 0;
}

2.0 显式类型转换(强制转换)


示例:浮点转整数(精度丢失)

#include <stdio.h>

int main() {
    float f = 3.99f;
    int i = (int)f; // Explicit conversion, fractional part is lost
    printf("i = %d\n", i); // Output: i = 3
    return 0;
}

浮点数转化为小数会把小数部分全部截断,然后小数部分省略掉


示例:溢出风险

#include <stdio.h>

int main() {
    unsigned short us = 65535; // Maximum value for unsigned short
    us = us + 1;               // Overflow occurs, us becomes 0
    printf("us = %u\n", us);   // Output: us = 0
    return 0;
}

示例:指向不同类型指针的转换(不推荐)

#include <stdio.h>

int main() {
    int x = 10;
    void *vp = &x;
    int *ip = (int*)vp; // Explicit conversion from void* to int*
    printf("*ip = %d\n", *ip); // Output: *ip = 10

    // Attempting to dereference incorrectly can lead to undefined behavior
    char *cp = (char*)vp;
    printf("*cp = %d\n", *cp); // Behavior depends on system's endianness
    return 0;
}

3.0 结构体和联合体


示例:结构体成员访问(无直接转换)

#include <stdio.h>

struct Point {
    int x;
    int y;
};

int main() {
    struct Point p = {10, 20};
    int *ptr = (int*)&p; // Accessing members through pointer arithmetic (not recommended)
    printf("x = %d, y = %d\n", ptr[0], ptr[1]); // Output: x = 10, y = 20
    return 0;
}

示例:联合体的特殊性


#include <stdio.h>

union Data {
    int i;
    float f;
};

int main() {
    union Data data;
    data.i = 123456;
    printf("data.i = %d, data.f = %f\n", data.i, data.f); // Output depends on representation
    return 0;
}

4.0 浮点数与整数的转换


示例:整数转浮点数

#include <stdio.h>

int main() {
    int i = 100;
    float f = (float)i; // Conversion from int to float
    printf("f = %f\n", f); // Output: f = 100.000000
    return 0;
}

5.0  常量表达式的转换


示例:整数常量默认类型

#include <stdio.h>

int main() {
    long l = 2147483648; // This value exceeds the range of int, so it's treated as long
    printf("l = %ld\n", l); // Output: l = 2147483648
    return 0;
}

示例:浮点常量默认类型

#include <stdio.h>

int main() {
    float f = 3.14f; // Specifying 'f' suffix makes it a float
    double d = 3.14; // Without suffix, it's treated as double by default
    printf("f = %f, d = %lf\n", f, d); // Output: f = 3.140000, d = 3.140000
    return 0;
}

......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值