On 2/19/2018 4:14 AM, Chris Angelico wrote:
On Mon, Feb 19, 2018 at 7:40 PM, Alain Ketterlin
<al...@universite-de-strasbourg.fr.invalid> wrote:
Tim Delaney <timothy.c.dela...@gmail.com> writes:
C is statically and weakly typed. Variables know their types at compile
time (static typing). It is a feature of the language that you can cast any
pointer to any chunk of memory to be a pointer to any other type (normally
via void *). This is not coercion - it takes the bit pattern of memory of
one type and interprets it as the bit pattern for another type, and is weak
typing.
No. C has much stronger rules, not on casting, but on accessing the
pointees, which basically invalidates your argument. Refer to the C
standard for details.
Really? What rules?
$ cat demo.c; gcc -Wall demo.c; ./a.out
#include <stdio.h>
int main() {
float f = 3.14159;
int *i = (int *)&f;
printf("As an integer, %f is %d\n", f, *i);
return 0;
}
As an integer, 3.141590 is 1078530000
$
Looks to me like C is perfectly happy to interpret a float as an int.
What rules are you seeing violated here?
The last time I tried, C was also willing to ints and arrays thereof as
an array of chars. (I vaguely remember Fortran doing something like this
also. One Fortran int = four chars.) The C memory model is a linear
sequence of bytes, each consisting of at least 8 bits. One means for
malware attacks it is to disguise and insert binary code bytes as
character bytes and then trick the CPU into executing the 'characters'.
--
Terry Jan Reedy
--
https://mail.python.org/mailman/listinfo/python-list