warning: integer overflow in expression [-Woverflow]

C语言大数字表示易错点

错误事例

#include 
#include 
#include 

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 
#include 
#include 

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)

你可能感兴趣的:(C语言)