当前位置: 首页 > news >正文

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;
}

......

相关文章:

  • 力扣hot100 ——搜索二维矩阵 || m+n复杂度优化解法
  • 前端js题目大全
  • 计算机视觉算法实战——表面缺陷检测(主页有源码)
  • UE引擎游戏加固方案解析
  • 一文了解PLM项目管理系统
  • 51单片机-定时器中断
  • 「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件
  • SpringBoot+Vue3-学习笔记
  • java泛型
  • 交通物联网:概念、历史、现状与展望
  • Redis 字符串(String)
  • 【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进
  • Vue 监听属性(watch)
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 2
  • 嵌入式工业级显示器在环保垃圾柜设备中发挥着至关重要的作用
  • Linux 实操篇 组管理和权限管理、定时任务调度、Linux磁盘分区和挂载
  • Linux-C/C++《C/9、信号:基础》(基本概念、信号分类、信号传递等)
  • 2025年archlinux tigervnc分辨率设置不生效的问题
  • Deepseek 与 ChatGPT:AI 浪潮中的双子星较量
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-loaders.py
  • 美妆网站建设方案/查询网址域名
  • 做网站推广送什么/页面优化算法
  • 丰台网站建设报价/网站开发工具
  • 网站如何开通微信支付接口/lol关键词查询
  • 长沙找人做网站/青岛网站权重提升
  • 顺德网站建设策划/苏州搜索引擎优化