If casting in C worked as you describe, then casting the number 33 from an integer into a float, would not result in 33.0 but rather some crazy value based on whatever that bit pattern means in IEEE floating-point representation. But that’s not how it works – the value will get properly converted, showing that the compiler is quite aware of the original type. (It won’t change the type of the original variable, since C is statically typed, but it will automatically create a temporary value on the stack if needed.)
In order to reinterpret an integer as a float without conversion, you need to take its address, cast that from a pointer-to-integer to a pointer-to-float, and then access the same memory via the float-pointer. At that point you’re simply telling the compiler “trust me, I know what I’m doing”. But even this is still type-safe in the sense that the compiler knows what the type of each pointer is, knows how to convert between those types, and will not allow unsafe conversions unless you explicitly ask for them.
But when it comes to being aware of the type of every value in the code and not allowing operations between incompatible types unless you go out of your way to assure the compiler that that is what you want to do, C is actually a lot stricter and more nitpicky than Perl, which will happily autoconvert things implicitly at the drop of a hat, even when the result will almost certainly not be what the programmer intended. E.g. cos(“three”) in Perl will silently autoconvert the string into the number 0, while C will give an error because you cannot call ‘cos’ with a string argument without explicitly telling the compiler how you want it to convert that string into a number.
[QUOTE=Jragon]
Nobody really quite agrees on what “strong typing” actually means.
[/QUOTE]
“In general, these terms do not have a precise definition. Rather, they tend to be used by advocates or critics of a given programming language, as a means of explaining why a given language is better or worse than alternatives.” Heh. 
But apparently, the original definition from the people who invented the term, is “whenever an object is passed from a calling function to a called function, its type must be compatible with the type declared in the called function.” And “in a strongly typed language each data area will have a distinct type and each process will state its communication requirements in terms of these types.”
That seems to describe C/C++ better than Perl, in my opinion, since the latter will almost never complain about calling a function with a value of the wrong type, but will just happily autoconvert that value even if the result probably won’t be what the programmer intended.