mpaque dos cortos en un int, lidiando con negativos y positivo

Estoy haciendo una clase PackedUnsigned1616 que almacena dos cortos sin firmar en un int, y una clase PackedSigned1616 que almacena dos cortos firmados en un int. He leído sobre operaciones bit a bit, pero todavía estoy confundido sobre cómo tratar con y sin signo y los valores que son más grandes o más pequeños que el rango de un corto (se pasan como dos ints). Esto es lo que tengo hasta ahora:

public final class PackedUnsigned1616 {
public final int field;

private static final int RIGHT = (2 << 15) - 1;
private static final int LEFT = ((2 << 31) - 1) ^ RIGHT;

public PackedUnsigned1616(int left, int right) {
    field = (left << 15) | (right & RIGHT);
}

public int getLeft() {
    return field >> 15;
}
public int getRight() {
    return field & RIGHT;
}

}

Todo este concepto me confunde mucho, así que si pudieras arrojar un poco de luz sobre eso, sería de gran ayuda.

Respuestas a la pregunta(1)

Su respuesta a la pregunta