C语言类型
-运算符sizeof
-整数
char、short、int、long、long long
-浮点数
float、double、long double
-逻辑
bool
-指针
-自定义类型
运算符sizeof
给出某个类型或者变量在内存中所占据的字节数
如sizeof(int) sizeof(a)
sizeof是一个静态运算符,它的结果在编译时刻就决定了,因此不要再sizeof的括号里做运算,这些运算不会被执行
例如:int a=6;
int b=sizeof(a++);
printf("%d",a) //结果是6而不是7
整数类型
char 1Byte
short 2Byte
int 取决于CPU和编译器,通常是一个字,表示一个寄存器的大小,通常4Byte
long 取决于CPU和编译器,4Byte或者8Byte
long long 8Byte
以下是64位机执行结果
整数的内部表达
负数在计算机内部是以补码的方式存在的,这样方便加法运算,减法运算可以直接转换为加法运算。
实际运算的时候需要注意数据类型的范围,小心越界
整数的范围
0000 0000 ~ 0111 1111 // 0~127
1111 1111~1000 0000 //-1~-128
char : 一个字节 -128~127
short: 两个字节 -32768~32767
int: 假如4字节 -2^32-1~2^(32-1)-1
无符号类型
unsigned char/int/... //二进制只表示0和正数,不表示负数
如果一个字面常数想要表达自己是unsigned,可以在后面加上u或者U
如果一个字面常数想要表达自己是long,可以在后面加上l或L
printf函数
%d 比int小的类型用%b输出的时候会转换成int再输出
%u 无符号类型
%lld
%lu
0开头表示8进制
0x开头表示16进制
%o 输出8进制
%x 输出16进制
浮点类型
float 7个有效位 1.23f表示float scanf %f printf %f /%e
double 15个有效位 1.23表示double scanf %lf printf %f/%e
printf("%.3f",f) //保留小数点后三位,自动四舍五入,注意如果1.2345一般输出1.234,因为1.2345实际表示为1.23449999..
浮点数比较大小
浮点数一般不能直接比较大小,因为精度的问题一般都不相等
若想比较大小使用
fabs(f1-f2)<1e-12 //比较float <1e-18比较double
浮点数表示inf和nan
printf("%f",12.0/0.0) //inf
printf("%f",-12.0/0.0) //-inf
printf("%f",0.0/0.0) //nan
printf("%d",12/0) //编译错误
字符类型
单引号表示字符
%c输入输出
scanf("%d %c") //不加空格的话后面%c读入的就是空格
// 输入 1 (注意这里有两个空格)a 读入的字符仍然是a,因为后面的空格(和换行、制表符)都被读了
逃逸字符
\" //表示双引号
\b //回退一格
\' //单引号
\t //下一个表格位,相当于用了一个tab
\n //换行
\r //回车,回到行首
类型转换
自动转换为宽类型
对于printf ,任何小于int的类型都会被转换成int,float会转换成double
但是scanf不会,要输入short,需要%hd
强制类型转换
(类型)值
强制类型转换优先级高于四则运算
int i=(int)a/b //错
int i=(int)(a/b) //对
#include<stdio.h>
int main()
{
int a = 2147483647; //int的最大正整数,0后面31个1
int b = -1;//32个1
unsigned int c = 4294967295;//4294967295为32个1
long long int d = 4294967296;//4294967296为1个1后面32个0
printf("sizeof(int) = %d\n", sizeof(int));
printf("sizeof(long long) = %d\n", sizeof(long long));
printf("用int表示一个1后面31个0: \t%d\n", a+1); //a+1就是一个1后面31个0,b+1是一个1后面32个0
printf("用int表示32个1: \t%d\n", b);
printf("用int表示32个0: \t%d\n", b+1);
printf("用long long表示一个1后面31个0: \t%lld\n", a+1);
printf("用long long表示32个1: \t%lld\n", b);
printf("用long long表示1后面32个0: \t%lld\n", b+1);
printf("用long long表示4294967295+1: \t%lld\n", c+1);
printf("用long long表示4294967296: \t%lld\n", d);
return 0;
}
结论:int强制转换为long long,会添加32位,第一位加的是0表示正数,printf输出的时候发生int转向long long时,先计算后面表达式的值再转long long,并且后面的表达式先计算的时候仍然会导致越界时候进位丢失,参考以lld格式输出b+1,b表示32个1,b+1之后变成了32个0,进位丢失,然后再lld输出的时候前面补上32个0,结果为0。
bool 类型
c语言没有实际的bool类型,给一个bool类型的数字赋1、2、3等等都是可以的。输出的时候也是使用%d来输出,0表示false,1表示true.
运算符的优先级
逻辑运算符&&和||会短路,对于&&,如果左边是false,就不会执行右边,对于||,如果左边是true,也不会执行右边。
条件运算符 a?b:c 优先级只比赋值高
逗号运算符 , 主要用在for循环里面 for(i=0,j=10;i<j;i++,j--)... 优先级比赋值还低
逗号运算符会把逗号右边的表达式作为结果返回,例如:
a=3+4,5+6 //warning:5+6 not used a的结果是7
a=(3+4,5+6) //warning:3+4not used a的结果是11