Per man dir.1:
The SIZE argument is an integer and optional unit (example: 10K is 10*1024). Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
Per info ls:
‘-h’
‘--human-readable’
Append a size letter to each size, such as ‘M’ for mebibytes. Powers of 1024 are used, not 1000; ‘M’ stands for 1,048,576 bytes. This option is equivalent to --block-size=human-readable. Use the --si option if you prefer powers of 1000.
The output for ls is further backed up in the source here and here.
It would seem as though the single letter is the 1024 measurement. The two digit character abbreviations are the 1000 SI units.
Since ulimit is builtin to bash, going to their source is the definitive...source. I'm often punny, but you can see it here and here:
Values are in 1024-byte increments, except for -t, which is in seconds,
-p, which is in increments of 512 bytes, and -u, which is an unscaled
number of processes.
Your version is probably older than the bash-5.2-rc3, which is fine, the size of that item hasn't changed in at least the last decade since 4.0.38 was released. You can see it here and here.
Edit: the man page for units.7 explains this in detail, but it appears to be quite messy from the UnitsPolicy.