前言
本篇博客文章整理了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语言有所帮助。
如有任何问题,欢迎留言讨论。如果觉得本文对您有所帮助,请不要忘了点赞、分享和关注,一键三连支持我们继续创作优质内容!