unsigned unsigned_high_prod(unsigned x,unsigned y)
{
int w = sizeof(int)<<3;
unsigned x_left_most_bit = x>>(w-1);
unsigned y_left_most_bit = y>>(y-1);
unsigned u=(unsigned)signed_high_prod((int)x,(int)y);
return u+x_left_most_bit*y+y_left_most_bit*x;
}