multi-character constant

Discussion in 'C Programming' started by aarklon@gmail.com, Nov 21, 2007.

  1. Guest

    Hi all,

    what exactly is the purpose of multi-character constant..???
    , Nov 21, 2007
    #1
    1. Advertising

  2. Tor Rustad Guest

    wrote:
    > Hi all,
    >
    > what exactly is the purpose of multi-character constant..???


    Do you mean UCN?

    --
    Tor < | tr i-za-h a-z>
    Tor Rustad, Nov 21, 2007
    #2
    1. Advertising

  3. James Kuyper Guest

    Tor Rustad wrote:
    > wrote:
    >> Hi all,
    >>
    >> what exactly is the purpose of multi-character constant..???

    >
    > Do you mean UCN?
    >


    No. See 6.4.4.4p10: "The value of an integer character constant
    containing more than one character (e.g., 'ab'), or containing a
    character or escape sequence that does not map to a single-byte
    execution character, is implementation-defined."

    I have no idea which implementations support meaningful definitions for
    multi-character constants, nor what they use them for.I imagine that one
    possible form of implementation defined behavior might be to have

    int i = 'ab';

    have exactly the same effect as

    memcpy(&i, "ab", sizeof i);

    I'm not sure how useful that would be.
    James Kuyper, Nov 21, 2007
    #3
  4. wrote:
    > what exactly is the purpose of multi-character constant..???


    It's not 100% clear what you mean; an example would be helpful.

    If you mean something like 'ab', the best answer is that if you have to
    ask, you don't need to know. All the standard says is (C99 6.4.4.4p10):

    The value of an integer character constant containing more than
    one character (e.g., 'ab') [...] is implementation-defined.

    In practice, the value of 'ab' is likely to be either 'a' * 256 + 'b'
    or 'b' * 256 + 'a'. It will vary from one compiler to another.

    The only place I've seen them actually used is in software for PalmOS,
    where, if I recall correctly, they're used to provide unique 16-bit tags
    for applications. Something like 'XY' that's related to the name of the
    application is easier to remember than a numeric constant. In that
    context, the actual value doesn't matter, just that each pair of
    characters maps to a consistent and unique integer value. This depends
    on every compiler using the same mapping, or on all applications being
    compiled with the same compiler.

    But a sufficiently perverse compiler could legally have all such
    constants have the value 42.

    Avoid such constants unless you really need them *and* you're prepared
    to deal with the fact that they're inherently non-portable.

    --
    Keith Thompson (The_Other_Keith) <>
    Looking for software development work in the San Diego area.
    "We must do something. This is something. Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
    Keith Thompson, Nov 21, 2007
    #4
  5. Guest

    Re: multi-character constant

    Do not use them.
    , Nov 21, 2007
    #5
  6. Guest

    Re: multi-character constant

    On Nov 21, 5:53 pm, Keith Thompson <> wrote:
    > wrote:
    > > what exactly is the purpose of multi-character constant..???

    >
    > It's not 100% clear what you mean; an example would be helpful.
    >
    > If you mean something like 'ab', the best answer is that if you have to
    > ask, you don't need to know. All the standard says is (C99 6.4.4.4p10):
    >
    > The value of an integer character constant containing more than
    > one character (e.g., 'ab') [...] is implementation-defined.



    In practice, the value of 'ab' is likely to be either 'a' * 256 + 'b'
    or 'b' * 256 + 'a'. It will vary from one compiler to another.

    I don't think that the above argument of yours is correct.

    i have seen a program like this:-

    #include<stdio.h>
    int main(void)
    {
    char str['11'] = {"work hard"};
    printf("%d\n",sizeof(str));
    return(EXIT_SUCCESS);
    }

    and the o/p is given as 12593
    now by your reasoning the o/p should be 1*16 +1 = 17 isn't it...???
    , Nov 22, 2007
    #6
  7. santosh Guest

    Re: multi-character constant

    In article
    <>,
    <> wrote on Thursday 22 Nov 2007
    10:45 am:

    > On Nov 21, 5:53 pm, Keith Thompson <> wrote:
    >> wrote:
    >> > what exactly is the purpose of multi-character constant..???

    >>
    >> It's not 100% clear what you mean; an example would be helpful.
    >>
    >> If you mean something like 'ab', the best answer is that if you have
    >> to
    >> ask, you don't need to know. All the standard says is (C99
    >> 6.4.4.4p10):
    >>
    >> The value of an integer character constant containing more than
    >> one character (e.g., 'ab') [...] is implementation-defined.

    >
    >
    > In practice, the value of 'ab' is likely to be either 'a' * 256 + 'b'
    > or 'b' * 256 + 'a'. It will vary from one compiler to another.
    >
    > I don't think that the above argument of yours is correct.
    >
    > i have seen a program like this:-
    >
    > #include<stdio.h>
    > int main(void)
    > {
    > char str['11'] = {"work hard"};
    > printf("%d\n",sizeof(str));
    > return(EXIT_SUCCESS);
    > }
    >
    > and the o/p is given as 12593
    > now by your reasoning the o/p should be 1*16 +1 = 17 isn't it...???


    No. By his reasoning it would be:

    '1' * 256 + '1'

    or

    '1' * 256 + '1'

    Note the single quotes around 1. The compiler replaces the character
    literal with whatever encoding the implementation uses for it. Thus
    if '1' is represented by the value 50 (just an example) the expression
    would be:

    50 * 256 + 50

    or

    50 * 256 + 50

    As Keith said this is implementation dependent behaviour and the
    Standard has very little to say about how multi-character character
    constants are interpreted.

    Apply the above formula and see that Keith conclusion was correct for
    ASCII based systems. In the ASCII encoding '1' is represented by the
    number 49. Thus:

    49 * 256 + 49 = 12593

    But you cannot depend on this in general.
    santosh, Nov 22, 2007
    #7
  8. Guest

    Re: multi-character constant

    On Nov 22, 1:20 am, santosh <> wrote:
    > In article
    > <>,
    > <> wrote on Thursday 22 Nov 2007
    > 10:45 am:
    >
    >
    >
    > > On Nov 21, 5:53 pm, Keith Thompson <> wrote:
    > >> wrote:
    > >> > what exactly is the purpose of multi-character constant..???

    >
    > >> It's not 100% clear what you mean; an example would be helpful.

    >
    > >> If you mean something like 'ab', the best answer is that if you have
    > >> to
    > >> ask, you don't need to know. All the standard says is (C99
    > >> 6.4.4.4p10):

    >
    > >> The value of an integer character constant containing more than
    > >> one character (e.g., 'ab') [...] is implementation-defined.

    >
    > > In practice, the value of 'ab' is likely to be either 'a' * 256 + 'b'
    > > or 'b' * 256 + 'a'. It will vary from one compiler to another.

    >
    > > I don't think that the above argument of yours is correct.

    >
    > > i have seen a program like this:-

    >
    > > #include<stdio.h>
    > > int main(void)
    > > {
    > > char str['11'] = {"work hard"};
    > > printf("%d\n",sizeof(str));
    > > return(EXIT_SUCCESS);
    > > }

    >
    > > and the o/p is given as 12593
    > > now by your reasoning the o/p should be 1*16 +1 = 17 isn't it...???

    >
    > No. By his reasoning it would be:
    >
    > '1' * 256 + '1'
    >
    > or
    >
    > '1' * 256 + '1'
    >
    > Note the single quotes around 1. The compiler replaces the character
    > literal with whatever encoding the implementation uses for it. Thus
    > if '1' is represented by the value 50 (just an example) the expression
    > would be:
    >
    > 50 * 256 + 50
    >
    > or
    >
    > 50 * 256 + 50
    >
    > As Keith said this is implementation dependent behaviour and the
    > Standard has very little to say about how multi-character character
    > constants are interpreted.
    >
    > Apply the above formula and see that Keith conclusion was correct for
    > ASCII based systems. In the ASCII encoding '1' is represented by the
    > number 49. Thus:
    >
    > 49 * 256 + 49 = 12593
    >
    > But you cannot depend on this in general.


    okay you are correct i got the point. but i made a mistake in earlier
    post it should have been '1' *256 + '1'

    BTW on what basis we are selecting this value of 256...???
    , Nov 22, 2007
    #8
  9. James Kuyper Guest

    Re: multi-character constant

    wrote:
    ....
    > okay you are correct i got the point. but i made a mistake in earlier
    > post it should have been '1' *256 + '1'
    >
    > BTW on what basis we are selecting this value of 256...???


    The value of mult-character literals is implementation-defined, 256 is
    just part of an example. It's CHAR_MAX+1 if char is unsigned and 8 bits,
    a rather common case. In my own example, I side-stepped the character
    size and signedness issues by using memcpy(). On bigendian systems where
    sizeof(int)==2, my example is equivalent to Keith's.
    James Kuyper, Nov 22, 2007
    #9
  10. Re: multi-character constant

    wrote:
    > On Nov 22, 1:20 am, santosh <> wrote:
    >> In article
    >> <>,
    >> <> wrote on Thursday 22 Nov 2007
    >> 10:45 am:
    >>> On Nov 21, 5:53 pm, Keith Thompson <> wrote:
    >>> In practice, the value of 'ab' is likely to be either 'a' * 256 + 'b'
    >>> or 'b' * 256 + 'a'. It will vary from one compiler to another.

    >
    > okay you are correct i got the point. but i made a mistake in earlier
    > post it should have been '1' *256 + '1'
    >
    > BTW on what basis we are selecting this value of 256...???


    Multiplying by 256 is the same as shifting left eight bits. So if you
    have 'a' * 256 + 'b' then you have an integer whose representation
    corresponds to the least-significant byte containing the value 'b' and
    the next-least-significant byte containing the value 'a'.

    Or, in picture form, showing a 32-bit 'int' split into its constituent
    8-bit bytes with big-endian byte order:

    +---+---+---+---+
    | 0 | 0 |'a'|'b'|
    +---+---+---+---+

    Note that all this assumes that CHAR_BIT == 8.
    Philip Potter, Nov 22, 2007
    #10
  11. On Wed, 21 Nov 2007 13:08:07 -0800 (PST), wrote:

    >Hi all,
    >
    >what exactly is the purpose of multi-character constant..???


    Since the implementation is free to define what such a constant
    evaluates to, it would seen that the answer to your question depends
    on that definition.

    If 'ab' will evaluate to 'a' or 'b', then it's only purpose would seem
    to be code obfuscation. On the other hand, if it evaluates to some
    constant independent of a and b, it doesn't seem to have any purpose.

    About the only somewhat useful purpose I can imagine is if
    int c = 'ab';
    was conceptually equivalent to something along the lines of
    int c;
    memcpy(&c,"ab",min(sizeof c, strlen("ab"));
    with "appropriate" consideration given to endian-ness as well as
    excessive or insufficient initialization bytes. But I expect the
    number of applications where this has any value to be miniscule.


    Remove del for email
    Barry Schwarz, Nov 22, 2007
    #11
  12. Willem Guest

    Barry wrote:
    ) About the only somewhat useful purpose I can imagine is if
    ) int c = 'ab';
    ) was conceptually equivalent to something along the lines of
    ) int c;
    ) memcpy(&c,"ab",min(sizeof c, strlen("ab"));
    ) with "appropriate" consideration given to endian-ness as well as
    ) excessive or insufficient initialization bytes. But I expect the
    ) number of applications where this has any value to be miniscule.

    The four-letter chunk identifiers in many file formats come to mind.

    I've seen pieces of code similar to this:

    switch(read_uint32(stream)) {
    case 'ILBM':
    /* Do something */
    case '8SVX':
    /* Do something else */
    default:
    /* Do nothing */
    }

    SaSW, Willem
    --
    Disclaimer: I am in no way responsible for any of the statements
    made in the above text. For all I know I might be
    drugged or something..
    No I'm not paranoid. You all think I'm paranoid, don't you !
    #EOT
    Willem, Nov 22, 2007
    #12
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Christopher M. Lusardi
    Replies:
    1
    Views:
    4,072
  2. Martin Magnusson
    Replies:
    2
    Views:
    491
    John Harrison
    Oct 8, 2004
  3. mimmo
    Replies:
    4
    Views:
    27,927
  4. saurabh29789

    Assign char variable with multi-character constant

    saurabh29789, May 28, 2009, in forum: C Programming
    Replies:
    1
    Views:
    941
    saurabh29789
    May 28, 2009
  5. emeraldsky23

    warning: multi-character character constant error

    emeraldsky23, Jan 15, 2011, in forum: C Programming
    Replies:
    0
    Views:
    1,008
    emeraldsky23
    Jan 15, 2011
Loading...

Share This Page