Поведение, которое вы наблюдаете, характерно для передачи параметров на основе стека.Для людей, которые по умолчанию компилируют 64-битный код x86 и не могут его воспроизвести, вы можете попробовать использовать "gcc -m32" вместо простого "gcc".
При передаче параметров на основе стека t1()
читать 32 бита из стека, и эти 32 бита образуют значение с плавающей запятой 2.0
.На сайте вызова, поскольку у t1
не было прототипа, аргумент f
был преобразован в double
, и это было double
, которое было записано в стек (C99 6.5.2.2:6 «Если выражениеэто означает, что вызываемая функция имеет тип, который не включает в себя прототип, целочисленные преобразования выполняются для каждого аргумента, а аргументы, имеющие тип float, повышаются до двойного. Это называется продвижением аргументов по умолчанию »).
У t1
нет оснований для восстановления нужного значения из стека, поскольку он не читает его должным образом с тем же типом и шириной, как было записано.