Why do we have negative length for character maximum length for geography and varchar(max) data types? Why do we have negative length for character maximum length for  geography and varchar(max) data types?

Character_Maximum_length = - 1
The value -1 is a special value that means "maximum currently supported". The maximum length of e.g. max, xml, and clr types could change in a future version of SQL Server.

In system views like INFORMATION_SCHEMA.COLUMNS the CHARACTER_MAXIMUM_LENGTH column already uses NULL for types where a character length is not applicable, for example the numeric types.

If you are currently using INFORMATION_SCHEMA views, you should read this and then consider using SQL Server's own metadata views like sys.columns instead.

As a side note, the underlying type of the max_length column in sys.columns is smallint NOT NULL. It is the maximum length (in bytes, not characters) of the column, or -1 meaning 'maximum supported` as mentioned before.