C语言大数字表示易错点
错误事例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
off_t bigNum = (4000 * 1024 * 1024 * 1024);
printf("bigNum:%ld\n", bigNum);
return 0;
}
上面的代码看上去没有什么问题,想表示400G的字节数,但是编译报错:
root@ubuntu:~/test# gcc -o bigNum bigNum.c
bigNum.c: In function ‘main’:
bigNum.c:7:33: warning: integer overflow in expression [-Woverflow]
off_t bigNum = (4000 * 1024 * 1024 * 1024);
原因
4000 * 1024 * 1024 * 1024
的每个值都是integer, 但是相乘的值超过了integer最大值(2147483647), 所以编译出错。
解决方法
将相乘的第一个数转成long long即可。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
off_t bigNum = (4000LL * 1024 * 1024 * 1024);
printf("bigNum:%ld\n", bigNum);
return 0;
}
举一反三
宏定义数字: 错误事例输出的结果可能是0.
// 正确例子
#define BIG (4000LL * 1024 * 1024 * 1024)
// 错误事例
#define BIG (4000 * 1024 * 1024 * 1024)