C语言编程秘籍:掌握数据类型存储长度、进制转换和输出格式调整

前言

本篇博客文章整理了C语言工程师在日常编程过程中常用到的知识点,包括数据类型存储长度、bool类型、可移植类型、进制与类型printf输出格式、端序、printf颜色输出和printf输出格式调整。我们还为您提供了相应的代码示例,以便您更好地理解这些概念。

1. 数据类型存储长度

数据类型在不同系统的处理位中,存储的字节长度可能不同。以下是一些常见数据类型的存储长度

数据类型32位系统64位系统
int4字节4字节
short2字节2字节
long4字节8字节
long long8字节8字节
unsigned4字节4字节
unsigned long4字节8字节
char1字节1字节
float4字节4字节
double8字节8字节
long double12字节16字节
int *4字节8字节
double *4字节8字节
char *4字节8字节
int(*)[5]4字节8字节

结论:不同系统的处理位中,数据存储的字节不同。

1.0 代码示例

#include <stdio.h>
int main() {
    int a = 100;
    short b = 150;
    long c = 100000L;
    long long d = 1000000LL;
    unsigned int e = 200;
    unsigned long f = 10000UL;
    unsigned long long g = 100000ULL;
    char h = 'A';
    float i = 3.14159f;
    double j = 3.1415926535;
    long double k = 3.141592653589793238L;

    printf("数据类型存储长度:\n");
    printf("int: %zu 字节\n", sizeof(int));
    printf("short: %zu 字节\n", sizeof(short));
    printf("long: %zu 字节\n", sizeof(long));
    printf("long long: %zu 字节\n", sizeof(long long));
    printf("unsigned: %zu 字节\n", sizeof(unsigned));
    printf("unsigned long: %zu 字节\n", sizeof(unsigned long));
    printf("unsigned long long: %zu 字节\n", sizeof(unsigned long long));
    printf("char: %zu 字节\n", sizeof(char));
    printf("float: %zu 字节\n", sizeof(float));
    printf("double: %zu 字节\n", sizeof(double));
    printf("long double: %zu 字节\n", sizeof(long double));

    return 0;
}

1.1 32位结果

请添加图片描述

1.2 64位结果

请添加图片描述

1.3 结果分析:

这些输出结果展示了在64位系统中,各种数据类型的存储长度。在32位系统中,long 和 unsigned long 的长度为4字节,指针类型的长度为4字节。其他数据类型的长度在32位和64位系统中保持不变。

2. bool类型

布尔型数据只有真、假两种取值,非零为真,零为假。以下是一些示例:

bool flag = true;  // 真
bool flag2 = false; // 假
bool flag3 = 1283;   // 非零为真
bool flag4 = -1283;  // 非零为真
bool flag5 = 0;      // 假

3. 可移植类型

3.1 概念

可移植类型指的是在不同系统上,数据类型的尺寸保持不变的整型数据。例如,嵌入式开发中常用到的可移植类型:int32_t、uint32_t、u8、u16等。

3.2 关键词:typedef

示例

typedef int int32_t; // 将类型 int 取个别名,称为 int32_t
typedef long int64_t; // 将类型 long 取个别名,称为 int64_t

3.3 32位系统编译

#include <stdio.h>
int main() {
    // 32位系统编译
    typedef long long int int64_t; // 先把数据类型写完整,再写要取的别名
    int64_t b;
    printf("int64_t len %dbyte\n", sizeof(int64_t));
    printf("int64_t b len %dbyte\n", sizeof(b));

    return 0;
}

结果
请添加图片描述

3.4 64位系统编译

#include <stdio.h>

typedef int int32_t;      		// 将类型 int 取个别名,称为 int32_t
typedef long int64_t;           // 将类型 long 取个别名,称为 int64_t

int main() {
    // 64位系统编译
    typedef long int int64_t; // 先把数据类型写完整,再写要取的别名
    int64_t a;
    printf("int64_t len %ldbyte\n", sizeof(int64_t));
    printf("int64_t a len %ldbyte\n", sizeof(a));

    return 0;
}

结果2
请添加图片描述

4. 进制与类型printf输出格式

4.1 常见进制和类型的输出格式

进制/类型赋值前/后缀输入、输出格式
8进制0%o
16进制0X或者0x%X或%x
short%hd
longL(例1000L;)%ld
long longLL(a4=1000LL)%lld
unsignedU(如a =1231U)%u
unsigned longUL(如a=10000UL)%lu
unsigned long longULL(如:a8=10000ULL)%llu
char%c
float%f %e
double%lf %le %e %f

4.2 代码示例

#include <stdio.h>

int main() {
    int dec = 100;
    int oct = 0144;
    int hex = 0x64;
    short s = 32767;
    long l = 100000L;
    long long ll = 1000000LL;
    unsigned int u = 12345U;
    unsigned long ul = 10000UL;
    unsigned long long ull = 100000ULL;
    char c = 'A';
    float f = 3.14159f;
    double d = 3.1415926535;
    long double ld = 3.141592653589793238L;
    char str[] = "Hello, World!";
    void *ptr = &dec;

    printf("八进制: %o\n", oct);
    printf("十六进制: %X\n", hex);
    printf("short: %hd\n", s);
    printf("long: %ld\n", l);
    printf("long long: %lld\n", ll);
    printf("unsigned: %u\n", u);
    printf("unsigned long: %lu\n", ul);
    printf("unsigned long long: %llu\n", ull);
    printf("char: %c\n", c);
    printf("float: %f\n", f);
    printf("double: %lf\n", d);
    printf("long double: %Lf\n", ld);
    printf("字符串: %s\n", str);
    printf("数据变量的地址: %p\n", ptr);

    return 0;
}

输出结果:
请添加图片描述

5. 端序

字节序是指整数在内存中存储的顺序,分为大端序和小端序。

5.1 概念

大端序:高字节在低地址,低字节在高地址
小端序:高字节在高地址,低字节在低地址

5.2 逻辑示例

假设我们有一个32位整数 0x12345678:

大端序:0x12 0x34 0x56 0x78
小端序:0x78 0x56 0x34 0x12

5.3 代码检测系统端序

#include <stdio.h>

union EndianTest {
    int i;
    char c[sizeof(int)];
};

int main() {
    union EndianTest endian;
    endian.i = 1;
    if (endian.c[0] == 1) {
        printf("小端序\n");
    } else {
        printf("大端序\n");
    }
    return 0;
}

6. printf颜色输出

使用ANSI转义序列可以在控制台输出彩色文本。

#include <stdio.h>

int main() {
    printf("\033[1;31mThis is red text.\033[0m\n");
    printf("\033[1;32mThis is green text.\033[0m\n");
    printf("\033[1;33mThis is yellow text.\033[0m\n");
    printf("\033[1;34mThis is blue text.\033[0m\n");
    printf("\033[1;35mThis is magenta text.\033[0m\n");
    printf("\033[1;36mThis is cyan text.\033[0m\n");
    printf("\033[1;37mThis is white text.\033[0m\n");

    return 0;
}

结果
请添加图片描述

7. printf输出格式调整

7.1 概念

我们可以通过格式化字符串来调整printf的输出结果。以下是一些常用的格式调整方法:

%m.n:整数部分占m位,小数部分占n位
%0m.n:整数部分用0填充至m位,小数部分占n位
%#o:显示八进制数的前导0
%#x或%#X:显示十六进制数的前导0x或0X
%+d:输出带符号的整数
% d:输出带空格的整数

7.2 代码示例

#include <stdio.h>

int main() {
    double value = 123.456789;
    int intValue = 12345;

    printf("保留2位小数: %.2f\n", value);
    printf("整数部分占5位,小数部分占3位: %5.3f\n", value);
    printf("整数部分用0填充至5位,小数部分占3位: %05.3f\n", value);
    printf("显示八进制数的前导0: %#o\n", intValue);
    printf("显示十六进制数的前导0x: %#x\n", intValue);
    printf("显示十六进制数的前导0X: %#X\n", intValue);
    printf("输出带符号的整数: %+d\n", intValue);
    printf("输出带空格的整数: % d\n", intValue);

    return 0;
}

结果
请添加图片描述

总结

本文整理了C语言工程师在日常编程过程中常用到的知识点,并为您提供了相应的代码示例。希望对您学习和使用C语言有所帮助。
如有任何问题,欢迎留言讨论。如果觉得本文对您有所帮助,请不要忘了点赞、分享和关注,一键三连支持我们继续创作优质内容!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想脱发的基兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值