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;https://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表示一个1后面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。
原文:https://www.cnblogs.com/foodie-nils/p/13110299.html