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

前言

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

1. 数据类型存储长度

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

数据类型 32位系统 64位系统
int 4字节 4字节
short 2字节 2字节
long 4字节 8字节
long long 8字节 8字节
unsigned 4字节 4字节
unsigned long 4字节 8字节
char 1字节 1字节
float 4字节 4字节
double 8字节 8字节
long double 12字节 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
long L(例1000L;) %ld
long long LL(a4=1000LL) %lld
unsigned U(如a =1231U) %u
unsigned long UL(如a=10000UL) %lu
unsigned long long ULL(如: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语言有所帮助。
如有任何问题,欢迎留言讨论。如果觉得本文对您有所帮助,请不要忘了点赞、分享和关注,一键三连支持我们继续创作优质内容!

猜你喜欢

转载自blog.csdn.net/qq_44330858/article/details/129843970