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

C: Why passing a float/double literal for an int argument does not raise warnings?

考虑这段代码:

#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

这是一个有效的转换 - 当您将其 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);
               ^~~

C 会自动执行此操作。如果将小数(如双精度或浮点数)放入 int、short、long 等,你得到的是截断后的数字。也就是说,所有小数点都被丢弃了。 3.3变成3,5.7变成5,依此类推