目录
1 int_t 是结构的标注,相当于type/typedef的缩写
名字 | 结果 | 范围 |
---|---|---|
int8_t | typedef signed char | -128 ~ 127 |
uint8_t | typedef unsigned char | 0 ~ 255 |
int16_t | typedef signed short | -32768 ~ 32,767 |
uint16_t | typedef unsigned short | 0 ~ 65535 |
int32_t | typedef signed int | -2147483648 ~ 2147483647 |
uint32_t | typedef unsigned int; | 0 ~ 4294967295 |
int64_t | typedef signed long long | -9223372036854775808 ~ 9223372036854775807 |
uint64_t | typedef unsigned long long | 0 ~ 18446744073709551615 |
即:
int8_t = signed char
uint8_t = unsigned char
int16_t = signed short
uint16_t = unsigned short
int32_t = signed int
uint32_t = unsigned int
int64_t = signed long long
uint64_t = unsigned long long
注意
有些编译器可能不能运行int_t,还是老老实实写全称吧!
2 size_t 与 ssize_t
size_t用于计数,如sizeof函数返回值类型即为size_t。
不同位的机器中所占位数也不同
size_t是无符号数,ssize_t是有符号数。
当变量有可能为负数时,必须使用ssize_t
3 无穷大 与 数组清零memset
参见:https://blog.csdn.net/qq_40893824/article/details/105753917
INF = 0x7fffffff 不是一个好办法,因为INF+INF此时会溢出!
const int64_t INF = 0x3f3f3f3f;
它的十进制是1061109567,是10^9级别的
非常nice
此时理由如下:
- INF+INF不溢出
0x3f3f3f3f + 0x3f3f3f3f=2122219134 - 数组清零:memset(a,0,sizeof(a)):方便高效,但将某个数组全赋值为无穷大时,就不能使用memset函数而得自己写循环了;
memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0(只有赋值为-1和0的时候才使用它)
现在,无穷大设为0x3f3f3f3f,它的每个字节都是0x3f!(16进制数3F)
所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。
3.1 malloc VS calloc
形式上:
char *str = (char *) malloc(length*sizeof(char));
char *str = (char *) calloc(length + 1, sizeof(char));
初始化内存空间的区别:
malloc:不能初始化 分配的内存,动态分度配内存后,里边数据是随机的垃圾数据
calloc:初始化 分配的内存,动态分配内存后,自动初始化内存空间为零
4 long long mod = 1e9 + 7
大佬的代码中经常出现这个数来表示一个特别大的数
好处如下:(原文章)
- 这是一个大的质数(或叫素数)
- 1e9+7相加不爆int,相乘不爆long long