简介:
自己复习C语言的时候总结了一下格式化输入输出占位符,以及各种变量的占用字节数,还有没提到的后面慢慢补充。(第一次学着发博客总结^-^,也可以帮助自己后续回顾)
部分变量类型及占用字节数:
(C头文件limits.h和float.h分别提供了与整数类型和浮点类型大小限制相关的详细信息)
c主要有以下几种变量,还有指针变量等等,对于占用字节数依据编译器不同,以及操作系统不同,得到的结果可能不同,本结果在Microsoft Visual Studio 2019 的32位及64位操作系统下得到。
c语言占用字节 | |||
系统类型 | 32位 | 64位 | 16位 |
char(存储为int) | 1 | 1 | 1 |
short int | 2 | 2 | 2 |
int | 4 | 4 | 2 |
long | 4 | 4 | |
long long | 8 | 8 | |
一般情况下windows64位一般使用LLP64模型 | |||
无符号与有符号占用字节数相同 | |||
float | 4(默认6位精度) | 4(默认6位精度) | |
double | 8 | 8 | |
long double | 8 | 8(依据编译器不同,C99只规定大于等于double) | |
_Complex | 复数的实部与虚部都基于实浮点类型构成 | ||
_Imaginary |
不同编译器的数据模型不同,导致long int占用4个字节或8个字节,本身C语言规定的是long≥int。不同编译器的结果参考如下:
编译器的数据模型
此处参考原文链接:64位操作系统下,关于int和long占用字节数同为4问题_静叶沉浮-CSDN博客_64位系统long
Datetype LP64 ILP64 LLP64 ILP32 LP32
char 1 1 1 1 1
short 2 2 2 2 2
int 4 8 4 4 2
long 8 8 4 4 4
long long 8
pointer 8 8 8 8 8
一般情况下windows64位一般使用LLP64模型
64位Unix,Linux使用的是LP64模型
格式化输入输出占位符归纳:
此处仅归纳了部分变量的占位符,以及一些函数,例如sizeof的占位符:
针对整型int变量以及浮点型float采用以下代码测试其占用字节数:
#include <stdio.h>
int main(void)
{
short a = 1;
int b = 2;
long c = 3;
long long d = 4;
unsigned short e = 5;
unsigned f = 6;
unsigned long g = 7;
unsigned long long h = 8;
long double k = 1.0;
double m = 9.0;
printf("The signed type occupy %zd, %zd, %zd, %zd bytes respectively.\n", sizeof(a), sizeof(b), sizeof(c), sizeof(d));
printf("The unsigned type occupy %zd, %zd, %zd, %zd bytes respectively.\n", sizeof(e), sizeof(f), sizeof(g), sizeof(h));
printf("long double: %zd, double: %zd", sizeof(k), sizeof(m));
return 0;
}
64位和32位编译器下的输出相同:
The signed type occupy 2, 4, 4, 8 bytes respectively.
The unsigned type occupy 2, 4, 4, 8 bytes respectively.
long double: 8, double: 8
sizeof( )函数:
sizeof函数在32位操作系统下,返回数据类型为long int,64位系统下返回为long long类型,因此占位符分别用%ld,%lld。C99和C11标准提供了%zd转换说明用以匹配sizeof返回类型。因此大部分情况下都可使用%zd,而且对于strlen()同样适用。
在C primer plus中还讲到了printf()中的一些其他转换修饰符:
先归纳到这儿吧,太久没打过代码TAT