1. Changelog
1.1. Revision 2 - February 20th, 2025
-
Fix typo for
oru
(rather than both capital letters) in wording.U -
Add a note to help to appease unsigned vs. signed people who keep fighting about this.
-
Rebase on current section numbers and text.
1.2. Revision 1 - June 17th, 2022
-
Add constraint to prevent
literals from becoming extended integer types (will be a proper Constraint Violation).size_t
1.3. Revision 0 - April 12th, 2022
-
Initial Release 🎉
-
Targeting C2y/C3a (after C23).
2. Design
This is a (minor) compatibility issue with literal suffixes that may be potentially used in shared code in the future. C++ adopted suffixed literals for size_t in [p0330]. The design is as follows:
#include <stddef.h>size_t ulit_val = 0 zu ;
The
, as with current literals, can be placed on either the left or the right of the
suffix to make it unsigned. For symmetry with existing suffix literal rules, it also has a signed variant. That type is the "signed integer type of size_t", which normally resolves to
:
#include <stddef.h>ptrdiff_t lit_val = 0 z ;
The signed variant lacks the
as a piece of the
suffix. This also matches the way
adjusts specific codes to display
or
-sized variables. The design is simple and, thankfully, compatible with C++. It also provides a way to avoid signed comparison warnings in compilers which implement more strict comparisons checks, e.g., when comparing a
value against some fixed constant value.
2.1. Even After Compatibility, Do We Really Need This?
Yes. The trip to put this paper into C++ was an extremely long one and came with a ton of reasons. All of it can be seen in [p0330] and 90% of that reasoning applies to C, especially in the face of
.
3. Wording
Wording is relative to the latest working draft.
3.1. Intent
The goal of this wording is to provide:
-
a literal suffix for both the signed (
) or unsigned (ptrdiff_t
) variant of the type of the expression "size_t
";sizeof ( 0 ) -
stop the literal from being too large for an expression of type
;size_t -
and, use the suffix
in either the formz
oruz
to produce azu
.size_t
3.2. Specification
3.2.1. Add two new grammar productions to §6.4.5.2 Integer literals, Syntax, ¶1
6.4.5.2 Integer literalsSyntax…
- integer-suffix:
- unsigned-suffix long-suffixopt
- unsigned-suffix long-long-suffix
- unsigned-suffix size-suffix
- long-suffix unsigned-suffixopt
- long-long-suffix unsigned-suffixopt
- size-suffix unsigned-suffixopt
…
- long-long-suffix: one of
- ll LL
- size-suffix: one of
- z Z
3.2.2. Add two new table rows to §6.4.5.2 Integer literals¸ Table 6.2
Table 6.2 — Relationship between constants, suffixes, and types
Suffix Decimal Literal Octal, Binary, or Hexadecimal Literal … … … z or Z the corresponding signed integer type of (7.21)
size_t the corresponding signed integer type of (7.21)
size_t Both u or U and z or Z (7.21)
size_t (7.21)
size_t If an integer literal that does not have
suffixes,
wb ,
WB , or
uwb
UWB ,
wb ,
WB , or
z in its integer suffix cannot be represented by any type in its list, it may have an extended integer type, if the extended integer type can represent its value. If all the types in the list for the literal are signed, the extended integer type shall be signed. If all the types in the list for the literal are unsigned, the extended integer type shall be unsigned. If the list contains both signed and unsigned types, the extended integer type may be signed or unsigned. If an integer literal cannot be represented by any type in its list and has no extended integer type, then the integer literal has no type.
Z NOTE While an integer literal
has the signed integer type corresponding to
64 ’800 z , such a type itself may not be suitable for representing the complete range for sizes (i.e. [
size_t ,
0 )).
SIZE_MAX Forward references: preprocessing numbers (6.4.8), numeric conversion functions (7.22.1) , common definitions(7.21) .
< stddef . h >