Arduino driver for 7 segment display with bit-shift register
What's really in show[2]?`

According to your comment:

int show[4]; // (thousands, hundreds, tens, ones)


the digits in show are in descending order.  But according to your code:

show[0] = ((int)number2show/1000);
show[1] = ((int)number2show%1000)/100;
show[3] = (((int)number2show%1000)%100)/10;
show[2] = ((((int)number2show%1000)%100)%10);


you swapped show[2] and show[3].  Was this a copy paste error?

Simplification

Your code for setting the show array can be simplified.


There's no need for an int cast because everything is already an int.
(((n % 1000) % 100) % 10) is equivalent to n % 10
Three of the four lines in the if and else case are common.


I would rewrite it like this:

    if (number2show &gt;= 0) {
        show[0] = (number2show / 1000) % 10;
    } else {
        show[0] = MINUS_SIGN;
        number2show = -number2show;
    }
    show[1] = (number2show / 100) % 10;
    show[2] = (number2show /  10) % 10;
    show[3] = number2show % 10;
    for (int i=0; i &lt; 4; i++)
        showDigit(show[i], digitPins[i]);


Variable scopes

I'm not sure if you use show anywhere else, but if you don't then you should make it be a local variable instead of a global.  Also, your other global arrays can be marked const since they are read-only.