C语言-数据类型所占字节数

本文通过一个简单的C程序展示了不同数据类型所占用的字节数,包括char、short、int、long、long long、float、double和long double等基本类型。测试环境为Ubuntu 16.04系统。

Type bytes

今天特意测试了所使用电脑的各种类型所占的字节数。
在此做个记录,以便查询。

首先看一下系统信息

$ screenfetch
                          ./+o+-       patrick@Marina
                  yyyyy- -yyyyyy+      OS: Ubuntu 16.04 xenial
               ://+//////-yyyyyyo      Kernel: x86_64 Linux 4.4.0-66-generic
           .++ .:/++++++/-.+sss/`      Uptime: 12h 24m
         .:++o:  /++++++++/:--:/-      Packages: 2246
        o:+o+:++.`..```.-/oo+++++/     Shell: zsh 5.1.1
       .:+o:+o/.          `+sssoo+/    Resolution: 1920x1080
  .++/+:+oo+o:`             /sssooo.   DE: Unity 7.4.0
 /+++//+:`oo+o               /::--:.   WM: Compiz
 \+/+o+++`o++o               ++////.   WM Theme: Ambiance
  .++.o+++oo+:`             /dddhhh.   GTK Theme: Ambiance [GTK2/3]
       .+.o+oo:.          `oddhhhh+    Icon Theme: Numix-Circle
        \+.++o+o``-````.:ohdhhhhh+     Font: Ubuntu 11
         `:o+++ `ohhhhhhhhyo++os:      CPU: Intel Core i5 CPU 750 @ 2.668GHz
           .o:`.syhhhhhhh/.oo++o`      GPU: GeForce GTX 550 Ti
               /osyyyyyyo++ooo+++/     RAM: 3252MiB / 3942MiB
                   ````` +oo+++o\:    
                          `oo++.      

然后写了一个C程序,来打印所有类型的bytes值

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

int max[5];
int main()
{
    int size = 5;
    int *ptr = malloc(size * sizeof(int));
    printf("%ld\n", sizeof(ptr));
    printf("%ld\n", sizeof(max));

    printf("===== type bytes =====\n");
    printf(" char type: %ld\n", sizeof(char));
    printf(" short type: %ld\n", sizeof(short));
    printf(" int type: %ld\n", sizeof(int));
    printf(" long type: %ld\n", sizeof(long));
    printf(" long long type: %ld\n", sizeof(long long));
    printf(" float type: %ld\n", sizeof(float));
    printf(" double type: %ld\n", sizeof(double));
    printf(" long double type: %ld\n", sizeof(long double));
    free(ptr);
}

程序输出如下:

$ ./test 
8
20
===== type bytes =====
 char type: 1
 short type: 2
 int type: 4
 long type: 8
 long long type: 8
 float type: 4
 double type: 8
 long double type: 16
<think>嗯,用户问的是C语言各种数据类型字节数。这个问题看起来基础,但其实要准确回答的话需要注意不同系统和编译器的差异。首先,我得回忆一下C语言的基本数据类型,比如int、char、float、double这些,还有short、long、long long以及派生类型如指针和枚举。 接下来,我得考虑不同环境下的字节大小。比如在32位和64位系统中,指针的大小可能不同,通常是4字节和8字节。但像int这样的类型,虽然通常是4字节,但在一些旧的系统或者嵌入式系统中可能不同。这时候应该强调这些差异,提醒用户实际使用时用sizeof运算符验证。 然后,可能需要组织一个表格,列出每种数据类型及其典型大小,同时说明这些大小可能变化的情况。比如char通常是1字节,但标准只是保证至少8位,而short通常是2字节,int是4字节,long在Linux 64位是8字节,而在Windows可能是4字节,这容易让人混淆,需要特别指出。 另外,用户可能没有明确说明他们的使用场景,比如是否涉及跨平台开发,这时候强调使用sizeof的重要性会更实用。还有,是否要包括C99新增的类型,比如stdint.h里的int32_t,或者unsigned类型?这些可能也需要简要提及,但根据问题描述,可能主要集中在基本数据类型上。 最后,检查是否有遗漏的类型,比如long double的大小差异,以及枚举类型通常和int相同。需要确保信息准确,同时避免误导用户认为这些大小是绝对固定的。可能还要举例子说明不同系统下的差异,比如在Windows和Linux中long的不同,这样用户能更清楚实际情况的多样性。</think>在C语言中,不同数据类型的字节大小与编译器和操作系统相关。以下是典型情况下的字节分布(基于x86架构的64位Linux/gcc和Windows/MSVC环境): --- ### 一、基本数据类型 1. **`char`** - 用途:存储字符或小整数 - 字节数:**1字节** - 范围:`-128` 到 `127`(有符号) / `0` 到 `255`(无符号) 2. **`short` (或 `short int`)** - 用途:节省内存的小整数 - 字节数:**2字节** - 范围:`-32,768` 到 `32,767` 3. **`int`** - 用途:通用整数 - 字节数:**4字节** - 范围:`-2,147,483,648` 到 `2,147,483,647` 4. **`long`** - 字节数- **4字节**(Windows/MSVC 64位) - **8字节**(Linux/gcc 64位) - 范围:与字节数对应(如8字节时范围为 $-9×10^{18}$ 到 $9×10^{18}$) 5. **`long long`** - 用途:超大整数 - 字节数:**8字节** - 范围:$-9×10^{18}$ 到 $9×10^{18}$ --- ### 二、浮点类型 1. **`float`** - 字节数:**4字节** - 精度:约6-7位小数 2. **`double`** - 字节数:**8字节** - 精度:约15位小数 3. **`long double`** - 字节数- **16字节**(Linux/gcc) - **8字节**(Windows/MSVC) - 精度:系统依赖 --- ### 三、其他类型 1. **指针类型(如 `int*`)** - 字节数- **4字节**(32位系统) - **8字节**(64位系统) 2. **枚举类型(`enum`)** - 字节数:通常与 `int` 一致(**4字节**) --- ### 四、验证方法 使用 `sizeof` 运算符直接获取类型大小: ```c printf("int size: %zu bytes\n", sizeof(int)); // 输出 int 的字节数 ``` --- ### 五、注意事项 - **平台差异**:例如 `long` 在Windows和Linux中的大小不同 - **标准保障**:C语言仅规定最小范围(如 `int` 至少为2字节),具体实现由编译器决定 - **跨平台开发**:建议使用 `<stdint.h>` 中的固定大小类型(如 `int32_t`) 如果需要精确控制内存,建议通过 `sizeof` 进行实际验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值