当前位置:首页 > 技术 > 正文内容

C语言基础数据类型与类型转换详解

访客 技术 2026年7月7日 1

基本数据类型及其存储特性

C语言中的基本数据类型在不同编译环境和硬件平台下可能具有不同的大小和取值范围。以下是主要类型及其典型表现:

  • 字符型:`char` 通常占1字节,可表示为有符号(-128 到 127)或无符号(0 到 255)。使用 `signed char` 或 `unsigned char` 可明确指定符号属性。
  • 短整型:`short` 一般为16位,范围为 -32,768 至 32,767;`unsigned short` 范围为 0 至 65,535。
  • 整型:`int` 在32位系统中通常为32位,范围约 -2.1×10⁹ 到 2.1×10⁹;`unsigned int` 范围为 0 到 4.2×10⁹。
  • 长整型:`long` 在32位系统中常为32位,而在64位系统中可能扩展至64位;`unsigned long` 同样依赖平台。
  • 长长整型:`long long`(C99标准引入)至少为64位,范围从 -2⁶³ 到 2⁶³−1;其无符号版本 `unsigned long long` 范围为 0 到 2⁶⁴−1。
  • 浮点型
    • `float`:单精度,有效数字约7位,范围约为 ±1.4×10⁻⁴⁵ 至 ±3.4×10³⁸。
    • `double`:双精度,有效数字约15~17位,范围约 ±4.9×10⁻³²⁴ 至 ±1.8×10³⁰⁸。
    • `long double`:扩展精度,具体实现因平台而异,但通常比 `double` 更大。
  • 布尔类型:`_Bool` 是C99新增的布尔类型,实际使用时推荐通过 `` 头文件定义的 `bool` 宏,配合 `true` 和 `false` 使用。
  • 枚举类型:`enum` 是基于整数的用户自定义类型,用于提升代码可读性。枚举值默认从0开始递增,可显式赋值。
  • void 类型:表示"无类型",主要用于函数返回值(如 `void func()`)或通用指针(如 `void*`),不指向具体数据。

变量与常量的差异

变量可在程序运行期间修改值,而常量一旦定义即不可更改。在C中可通过以下方式定义常量:

  • 使用 `const` 限定符:例如 `const int MAX = 100;`。
  • 使用宏定义:如 `#define PI 3.14159`,在预处理阶段替换。

类型大小查询方法

利用 `sizeof` 操作符可获取变量或类型所占用的字节数:

#include <stdio.h>
int main() {
    int a;
    char b;
    double c;
    printf("int size: %zu bytes\n", sizeof(a));
    printf("char size: %zu bytes\n", sizeof(b));
    printf("double size: %zu bytes\n", sizeof(c));
    return 0;
}

自动类型转换规则

C语言支持隐式类型转换,常见于表达式中类型提升:

  • 较小整型(如 `char`、`short`)在运算前会被自动提升为 `int`。
  • 整型与浮点型混合计算时,整型将被提升为对应浮点类型。
  • 枚举值在大多数情况下被视为整数,可直接参与数值运算。
  • 注意:结构体、联合体等复杂类型无法进行隐式转换。

强制类型转换语法

当需要显式控制类型转换时,使用强制转换语法:`(目标类型) 表达式`。

#include <stdio.h>
int main() {
    short s = 10000;
    int i = (int)s; // 强制转换
    char ch = 'A';
    int val = (int)ch; // 显式转为整数
    float f = 3.14159f;
    int n = (int)f; // 截断小数部分
    double d = 3.141592653589793;
    float f2 = (float)d; // 精度损失

    enum Color { RED, GREEN, BLUE };
    enum Color col = RED;
    int colorVal = (int)col;

    printf("s=%d, i=%d\n", s, i);
    printf("ch='%c', val=%d\n", ch, val);
    printf("f=%.2f, n=%d\n", f, n);
    printf("d=%.15f, f2=%.5f\n", d, f2);
    printf("col=%d, colorVal=%d\n", col, colorVal);

    return 0;
}

强制转换可用于指针类型间转换,如 `(void*)ptr`,但需谨慎使用以避免未定义行为。

标签: intchar

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。