• Re: Simple(?) Unicode questions

    From Tim Rentsch@21:1/5 to James Kuyper on Fri Jan 19 07:43:39 2024
    James Kuyper <jameskuyper@alumni.caltech.edu> writes:

    On 12/12/23 22:05, spender wrote:

    printf("%c",ch), the ch must <0xFF, <255

    The only 'ch' in the code that you responded to was declared as
    "char *", not char, [...]

    The posting in question also gave declarations

    char ch = [...];

    and

    wchar_t ch = [...];

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Tim Rentsch@21:1/5 to Keith Thompson on Sat Jan 20 09:33:42 2024
    Keith Thompson <Keith.S.Thompson+u@gmail.com> writes:

    Tim Rentsch <tr.17687@z991.linuxsc.com> writes:

    Lew Pitcher <lew.pitcher@digitalfreehold.ca> writes:

    On Wed, 13 Dec 2023 11:05:45 +0800, spender wrote:

    printf("%c",ch), the ch must <0xFF, <255

    Not quite.
    1) ch /must/ represent an integer value.

    More specifically, it must have a type that is or promotes
    to int, or a type that is or promotes to unsigned int, with
    a value that is in the common range of int and unsigned int.

    Not quite. "If no l length modifier is present, the int argument
    is converted to an unsigned char, and the resulting character is
    written." For example printf("%c", -193) is equivalent to
    printf("%c", 63), which assuming an ASCII-based character set will
    print '?'.

    The rule for arguments to printf() is the same as the rule for
    accessing variadic arguments using va_arg(). That has always
    been true, although not expressed clearly in early versions of
    the C standard. Fortunately that shortcoming is addressed in
    the upcoming C23 (is it still not yet ratified?): in N3096,
    paragraph 9 in section 7.23.6.1 says in part

    fprintf shall behave as if it uses va_arg with a type
    argument naming the type resulting from applying the
    default argument promotions to the type corresponding
    to the conversion specification [...]

    and the rule for va_arg (in 7.16.1.1 p2) says in part

    one type is a signed integer type, the other type is
    the corresponding unsigned integer type, and the value
    is representable in both types

    So supplying an unsigned int argument is okay, provided of
    course the value is in the range of values of signed int.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Tim Rentsch@21:1/5 to Keith Thompson on Wed Jan 24 20:38:26 2024
    Keith Thompson <Keith.S.Thompson+u@gmail.com> writes:

    Tim Rentsch <tr.17687@z991.linuxsc.com> writes:

    Keith Thompson <Keith.S.Thompson+u@gmail.com> writes:

    Tim Rentsch <tr.17687@z991.linuxsc.com> writes:

    Lew Pitcher <lew.pitcher@digitalfreehold.ca> writes:

    On Wed, 13 Dec 2023 11:05:45 +0800, spender wrote:

    printf("%c",ch), the ch must <0xFF, <255

    Not quite.
    1) ch /must/ represent an integer value.

    More specifically, it must have a type that is or promotes
    to int, or a type that is or promotes to unsigned int, with
    a value that is in the common range of int and unsigned int.

    Not quite. "If no l length modifier is present, the int argument
    is converted to an unsigned char, and the resulting character is
    written." For example printf("%c", -193) is equivalent to
    printf("%c", 63), which assuming an ASCII-based character set will
    print '?'.

    The rule for arguments to printf() is the same as the rule for
    accessing variadic arguments using va_arg(). That has always
    been true, although not expressed clearly in early versions of
    the C standard. Fortunately that shortcoming is addressed in
    the upcoming C23 (is it still not yet ratified?): in N3096,
    paragraph 9 in section 7.23.6.1 says in part

    fprintf shall behave as if it uses va_arg with a type
    argument naming the type resulting from applying the
    default argument promotions to the type corresponding
    to the conversion specification [...]

    and the rule for va_arg (in 7.16.1.1 p2) says in part

    one type is a signed integer type, the other type is
    the corresponding unsigned integer type, and the value
    is representable in both types

    So supplying an unsigned int argument is okay, provided of
    course the value is in the range of values of signed int.

    Re-reading what you wrote, I think I misunderstood your intent (and I
    think what you wrote was ambiguous).

    "%c" specifies an int argument.

    You wrote:

    More specifically, it must have a type that is or promotes to int,
    or a type that is or promotes to unsigned int, with a value that is
    in the common range of int and unsigned int.

    I read that as:

    More specifically,
    (it must have a type that is or promotes to int, or a type that is
    or promotes to unsigned int),
    with a value that is in the common range of int and unsigned int.

    which would incorrectly imply that a negative int value is not allowed.

    It's now clear to me that you meant was:

    More specifically,
    (it must have a type that is or promotes to int),
    or
    (a type that is or promotes to unsigned int, with a value that is in
    the common range of int and unsigned int).

    I agree with that.

    Right. Sorry for the confusion.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)