Получается что в (2) при первом вызове foo() ей передаётся два long (а поскольку ждёт она два int, первый long разваливается на две половинки и интерпретируется как два int), а при втором вызове - long преобразуются в int. Но разве можно чтобы в пределах одного модуля одна и та же функция рассматривалась как принимающая разные аргументы?
Ну то есть в принципе-то можно - см. тот же printf(). Но не так в лоб же?..

