Laramie is right about the bitmap and links to the right place in the manual. Yet, this is almost, but not quite correct:
So for any given row with one or more nulls, the size added to it
would be that of the bitmap(N bits for an N-column table, rounded up).
One has to factor in data alignment. The HeapTupleHeader (per row) occupies 23 bytes, actual column data always starts at a multiple of MAXALIGN (typically 8 bytes). That leaves one byte of padding that can be utilized by the null bitmap. In effect null storage is absolutely free for tables up to 8 columns.
After that, another MAXALIGN (typically 8) bytes are allocated for the next MAXALIGN * 8 (typically 64) columns. Etc. Always for the total number of user columns (all or nothing). But only if there is at least one actual null value in the row.
Notably, dropped columns still listed in the system catalog pg_attribute (marked as dropped) also occupy one bit in the null bit map. Not even VACUUM FULL can get rid of this residue, only a dump/restore cycle does. (So beware of anti-patterns that would add and drop table columns routinely.)
I ran extensive tests to verify all of that. More details: