数据类型
char
short
int 通常表示为一个字长
long 通常表示位一个字长
long long
double float
char
语言发展两条线路
强类型-> 接近系统底层
弱类型
数据类型c标准有的没有严格限制
short <= int <= long
而且与编译器类型也有关系
类型所占机器位数与特定的编译器平台相关
sizeof-静态运算符,编译时决定,不要在括号内做运算
无符号数和有符号数能表示的数字的个数都是固定的
可以想象在一个数轴上,两个表示的范围有所偏移,两个类型有交叉的部分,也有不交叉的部分
补码表示法的-1(二进制位上全是1)
表示负数的数字个数比正数的数字个数多一个
内存的视角上不存在有符号和无符号的区分
C语言中整型运算总是至少以缺省整型类型的精度来进行的
整型提升??数据不足机器字长时 先扩展字节,在解析内存中存的二进制值
尽量避免 宽松范围类型 赋值给狭小范围类型
隐式类型转换
整数溢出
UB 非法内存访问,有符号数字溢出,除零等
C标准都并未有严格规定执行行为的情况
为了适配不同的硬件厂商
UB发生时编译器可能直接把代码删了
float
同样是四字节的存储空间,能表达的数字范围比int大多了
这就涉及到一个小数的分布问题,有的范围小数稀疏 有的密集
强制类型转换优先级高于四则运算
位运算 逻辑门和导线是构成计算机(组合逻辑电路)的基本单元
位运算是用电路最容易实现的运算
与 或 非
异或
左移 右移
约定MSB 在左 ,LSB在右
判断集合中是否包含某一个元素
abcd
0b1110
0x5 = 0101
s&0x5 + (s>>1)&0x5
0b0100
0b0101
0b1001-->( 01代表cd这两个数有一个1,10代表ab这两个数有两个1) 每次判断两位
s&0x3 + (s>>2)&0x3 0b10 再加上0b01 就是最后代表这四位数字一共有多少个1
每两位得到的结果是这两位有多少个1
没两个两位加起来得到的结果是这四位有多少个1
以此类推