C语言数据类型
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <limits.h> // limits.h头文件提供当前编译器关于整数类型大小限制相关的详细信息MAX/MIN
#include <float.h> // float.h头文件提供当前编译器关于浮点类型大小限制相关的详细信息MAX/MIN
int main(void)
{
int a = 1; // 整数类型int,数字1为int常量
long int la = 1L; //整数类型long int 用long修饰int,long的取值范围应大于等于int的取值范围,在数字常量后面加L或小写的l表示为long常量1L
long long int lla = 1L; // 整数类型long long int,应至少占用8字节/64bit
short int sa = 1; // 整数类型short int 用short修饰int,short的取值范围应小于等于int的取值范围
float f = 1.0f; //浮点类型float,可表示小数部分,C标准规定float类型必须至少能表示6位有效数字,且取值范围至少是10^-37 ~ 10^+37,通常float占4字节/32bit,其中8位用于表示指数的值和指数的符号,24位用于表示非指数部分(尾数或有效数)的值和符号
double d = 1.0; //浮点类型double,双精度浮点,表示范围大于等于float,数字1.0为浮点数常量double常量,浮点数常量需要加小数点,(1.0可写为1.)(而0.1可写为.1) ,数字1.0f为float常量
long double ld = 1.0L; // 浮点类型long double,表示精度大于等于double,1.0L为long浮点数常量
char c = 'c'; // 字符类型character,c语言规定char占1字节/8bit,可直接表示ASCII码的字符,实际存储为整数类型
unsigned int ua = 1; //unsigned无符号的,可用来修饰数值类型,有符号的数值会使用二进制形式的首位作为符号位(首位为0则正数,为1则负数),用unsigned修饰会使首位也作为数值,所以最大值为有符号类型的2倍+1,最小值为0,与之对应的signed为有符号修饰词
unsigned long long int ulla = 5llu; // 常量5llu
a = 070; //八进制数,格式以0开头,070即7*8^1+0*8^0=56
a = 0x70; //十六进制,格式以0x开头,0x70即7*16^1+0*16^0=112,无论将变量a表述成什么形式,内部都是使用二进制形式存储
_Bool b = 1; //_Bool布尔类型,boolean,只分为1(即true)和0(即false)
printf("当前编译器规定int的最大值为%d\t最小值为%d\n", INT_MAX, INT_MIN);
// 当前编译器规定int的最大值为2147483647 最小值为-2147483648
printf("int上溢/超出上限%d\n", INT_MAX + 1); //int超出上限会变为最小值,因为最大值的二进制表示为首位0后31位1(01111...),加1会变为首位1后31位0(10000...)即最小值
printf("%o\n", 8); //%o转换说明,将参数显示为 无符号 八进制形式,结果10
printf("%#o\n", 8); //要显示为010则需要使用%#o转换说明
printf("%x\n", 15); //%x转换说明,将参数显示为 无符号 十六进制形式,结果f
printf("%#x\n", 15); //%#x转换说明显示为0xf格式
printf("%llu\n", ulla); //转换说明%llu将参数显示为unsigned long long int形式,%u表示unsigned int类型
printf("%hd\n", sa); //转换说明%hd将参数显示为short形式,相对的%ho为八进制short类型,%hx为十六进制short类型
printf("当前编译器规定float的最大值为%e\t最小值为%e\n", FLT_MAX, FLT_MIN); //float类型使用转换说明%e显示为指数形式如1.0e+1即1.0*10^1,使用%f表示十进制形式如10.0,使用%g自动判断使用e或者f转换说明
// 当前编译器规定float的最大值为3.402823e+38 最小值为1.175494e-38
printf("输入一个ASCII码值:");
scanf("%d", &a);
printf("值%d对应的字符为%c\n", a, a); // a为int类型,%d将a作为int类型输出,%c将a作为char类型输出数值对应的字符
/*结果
输入一个ASCII码值:65
值65对应的字符为A
*/
printf("\aStartled by the sudden sound, Sally shouted,\n\"By the Great Pumpkin, what was that!\"\n"); // \a为蜂鸣符,某些识别该字符的设备会发出警报声,\n为换行符,\t制表符,\b退格符使光标往前移动一格但不删除该字符,\r回车符使光标移至当前行首位,\"表示双引号",\'表示单引号'
d = 64.25; //单独赋值
printf("变量d小数点形式%f\t指数形式%e\t十六进制记数法%a\n", d, d, d);
//变量d小数点形式64.250000 指数形式6.425000e+01 十六进制记数法0x1.0100000000000p+6
//%f表示为小数点形式,默认有效数字位数为float的精度6位,可以通过%.2f更改为显示2位小数,%.f和%.0f同义
// 十六进制记数法为显示十六进制的指数形式,0x1.0100000000000p+6即(1*16^0+1/16^2)*2^6,十六进制的指数是2^n
d = 0xa.1fp10; //十六进制double类型,十六进制的a-f即十进制的10-15,0xa.1fp10即(10+1/16+15/16^2)*2^10,这里的f指15而不是float,如果要表示float常量应写为0xa.1p10f
printf("char类型占用%zd字节\n", sizeof(char)); //sizeof(数据类型)返回数据类型占用的字节数,对应的转换说明为%zd
// char类型占用1字节
printf("%zd\n", sizeof d);// sizeof也可用于返回变量占用的字节数,这种情况既可以用括号的形式,也可以使用空格隔开不加括号的形式 double类型d占用8字节
printf("30 age = %f seconds\n", 30.0 * 3.156e7); // 30.0和3.156e7均为double常量
return 0;
}