I see an OP and many (not all) responses that mix 2 different skills and areas of knowledge interchangeably. But they are very different.
- Understanding how to build a PC
- Understanding low level details of hardware with respect to controlling that hardware in programs
Option 1 requires the following type of knowledge (in general terms)
Which hardware components are required to create a working PC
Which brands/versions/specs of those compoents, etc. can be combined together
Option 2 requires the following type of knowledge (in general terms)
What are the detailed functional capabilities of the specific component
How are the various functions initiated
What are the expected results for every given set of inputs
I would agree with what many posters have already stated.
A large portion of programmers (myself included) probably do not know how to put together a PC without doing some googling, but generally understand which components are required.
As for scenario 2, again most programmers are working at a higher level than that, but most probably have a pretty reasonable understanding of how the hardware operates.