C语言写起来确实没有Java那么随心所欲,在printf里数据还要按不同的格式写法输出,记忆起来有点麻烦。
格式化占位符
语法格式如下:
%[标志][宽度][精度][长度][转换字符]
(标志、宽度、进度、长度都是可选的)
转换字符(specifier):
标志(flags):
宽度(width):
指定最小字段的宽度
精度(.precision):
1、对于字符串:打印的字符的最大个数
2、对于整数:打印的数字位数(填充0可增加宽度)
3、对于转换字符e、E、f:打印的数字小数点后的位数
4、对于转换字符g、G:打印的有效数字位数
长度(length):
hh:参数按signed char或unsigned char类型输出
h:参数按short或unsigned short类型输出
l:参数按long或unsigned long类型输出
ll:参数按long long或unsigned long long类型输出
L:参数按long double类型输出
示例
#include <stdio.h>
int main(){
int a=233;
char b='s';
float c=3.14;
double d=3.141592653;
printf("laugh:%d\n",a);
printf("S=%c\n",b);
printf("double1=%e\n",c);
printf("double2=%g\n",d);
printf("a=%u\n",a);
printf("%d%%\n",a);
printf("point=%void\n",c);
printf("unsigned int=%x\n",a);
printf("%+2\n",a);
printf("%#20.9f\n",d);
return 0;
}
结果如图:
数据类型
相比与Java,C语言里将数据类型分为:
整数型:short int、int、long int、long long int
浮点数型:float、double、long double
字符型:char(字符串结束位置是’\0’)
布尔型:_Bool(为了避免一些冲突长成这歪样了)
枚举型:enum
signed与unsigned:
补码
举例:
3的二进制为00000011
-3的二进制为10000011
3-3=3+(-3)=00000011+10000011=10000110
并非是预期的00000000
负数补码先按位取反(除了符号位),然后+1
-3=10000011===>11111100,再加1为11111101
那么00000011+11111101=100000000,左边的1溢出被自动舍弃,结果变为00000000,即0
二进制表示小数
举例:
101.011=(1*2^2) + (0*2^1) + (1*2^0) + (0*2^-1) + (1*2^-2) + (1*2^-3)
即小数点左边为2的正数次幂,右边为负数次幂,个位时为0次幂