As the author of varargs, I would like to set the record straight. The intention of varargs was that the type given to va_arg should only be a type that is meaningful as a parameter. Thus char, short, and float are never meaningful because they are automatically widened to int, int, and double respectively.