Tipos conflictivos en C, ¿por qué?

Estoy tratando de escribir una práctica básica con C, trabajando con Binary y Hex. Hice un método para imprimir los múltiplos de 2 (potencias de 2) y un método separado para imprimir la forma Hex de ese múltiplo de 2.

#include <stdlib.h>
#include <stdio.h>

const char one = 1;
const int bits = 31;

void    print2       ()
{
    unsigned int  u = (int)one;
    unsigned int j;

    printf("The powers of 2 are:\n");

    for(j=0;j<bits;j++)
    {
            unsigned int temp = u<<j;
            printf("%d\n",abs(temp));
            printhex(temp);
    }

    printf("\n\n");
}

void    printhex       (unsigned int   u)
{
    printf("0x%08X\n",u);
}

int main ()
{
    print2();
    return(EXIT_SUCCESS);
}

Lo que no entiendo es por qué recibo un error de "tipos en conflicto" al llamar al método "printHex". Específicamente solicito un entero sin signo y cuando llamo al método dentro del parámetro (que asumo que es un entero sin signo "temp"), el compilador no acepta.

Respuestas a la pregunta(2)

Su respuesta a la pregunta