Hi, hope this is the right list.
Here is my code and output, at the bottom of the e-mail. y is "correct", w and z obviously have problems - multiplying two 32-bit integers "hoping" the result would be correct assigning to 64-bit - I guess it is the same problem as double oneThird= 1/3; the result being zero, and not 0.3333.
I was wondering if there is any strict warning that would flag the w and z assignments below, or the 1/3 above - the whole right hand side is evaluated as a 32-bit integer number, and assigned to a 64-bit integer or double. Not advocating this should be a default, but turning it on would help me
detect some flaws in the code. Took me hours to catch a similar bug in my code, trying to solve a sparse system that has hundreds of millions of variables...
Thanks!
Ricardo
laplace utils % cat ovr.c
#include <stdio.h>
int main()
{
unsigned int x = 1015625426;
unsigned int t = sizeof(double);
size_t y = x * sizeof(double);
size_t w = x << 3;
size_t z = x * t;
printf("y= %zd w = %zd z = %zd\n", y, w, z);
}
laplace utils % gcc -Wall -o ovr ovr.c
laplace utils % ovr
y= 8125003408 w = 3830036112 z = 3830036112