"[4] A number of different language design decisions have been referred to as evidence of "strong" or "weak" typing.
Thiago Macieira discusses several problems that can arise when type-punning causes the compiler to make inappropriate optimizations.
For example, both C++ and C# allow programs to define operators to convert a value from one type to another with well-defined semantics.
In contrast, converting a value to the C type void* is an unsafe operation that is invisible to the compiler.
Some programming languages expose pointers as if they were numeric values, and allow users to perform arithmetic on them.
Because of the wide divergence among these definitions, it is possible to defend claims about most programming languages that they are either strongly or weakly typed.