C:为什么为int参数传递float / double常量不会引发警告?

时间:2018-11-20 16:33:27

标签: c linux gcc-warning

考虑以下代码:

#include <unistd.h>

int main(void) {
    sleep(.1);
    return 0;
}

我使用gcc -Wall sleep.c -o sleep进行编译,没有警告。 运行它给我

time ./sleep

real    0m0,001s
user    0m0,001s
sys     0m0,000s

.1神奇地变成了0,但我的问题是为什么没有警告? 我在Lubuntu 18.04中使用了库存gcc 7.3.0

2 个答案:

答案 0 :(得分:4)

这是有效的转换-将小数部分0.1转换为unsigned int时,小数部分将被丢弃。它本质上等效于sleep(0);。因此,不需要编译器发出任何诊断信息。

但是,gcc确实有一个选项-Wconversion会产生:

gcc -Wall -Wextra -pedantic -Wconversion a.c

    a.c: In function ‘main’:
    a.c:8:11: warning: conversion from ‘double’ to ‘unsigned int’ changes value from ‘1.0000000000000001e-1’ to ‘0’ [-Wfloat-conversion]
         sleep(0.1);
               ^~~

答案 1 :(得分:0)

C自动执行此操作。如果将小数(例如双精度或浮点型)放入int,short,long等中,则得到的是截断的数字。也就是说,所有小数点都掉了。 3.3变为3,5.7变为5,依此类推。