The Sentinel 2 L1C images started out as 12-bit, but that has been changed in early 2016 when ESA changed QUANTIFICATION_VALUE from 1000 to 10000. Now L1C is encoded as an
UINT16 jp2 file with (at least?) 15 significant bits. This is from
gdalinfo on a recent
Band 1 Block=1024x1024 Type=UInt16, ColorInterp=Gray
Overviews: 5490x5490, 2745x2745, 1372x1372, 686x686
Image Structure Metadata:
Taking this into account, the limit seems to be 32767 rather than 65535. Any JPEG2000 reader will return the sample value as two bytes, so any code that expects a 16 bit image is safe even if NBITS changes to 16 in the future.
Another note - the product metadata.xml that comes with all L1C tiles contains info about special NO_DATA and SATURATED values, which in recent products looks like this:
The SATURATED value of 65535 indicates that the intent was indeed to use the full range of uint16.
As for L2A, if the algorithm ideally corrected all specular reflections, DEM misregistration, emmited radiation and other causes of higher-than-100% reflectance, you should get output in the range 0..10000. Because no atmospheric correction is ideal, you can expect some values to be outside this range, most probably up to 65534, with 65535 again reserved for SATURATED pixels.