Velocity Reviews > C++ > casting int to char

casting int to char

Eric
Guest
Posts: n/a

 11-09-2006
Is there a simple, standard statement that will reinterpret an int in
the range of 0-9 as a char? I understand it's simple enough to write in
a function, but I wonder if there's a more general approach.

Gavin Deane
Guest
Posts: n/a

 11-09-2006

Eric wrote:
> Is there a simple, standard statement that will reinterpret an int in
> the range of 0-9 as a char? I understand it's simple enough to write in
> a function, but I wonder if there's a more general approach.

If you add an int in the range 0 to 9 to the char '0' you are
guaranteed to get the appropriate character in the range '0' to '9'.

#include <iostream>
using namespace std;

int main()
{
char c = '0';
for (int i = 0; i <= 9; ++i)
cout << static_cast<char>(c + i) << "\n";
}

Gavin Deane

Jim Langston
Guest
Posts: n/a

 11-09-2006
"Eric" <(E-Mail Removed)> wrote in message
news:eivohr\$697\$(E-Mail Removed)...
> Is there a simple, standard statement that will reinterpret an int in the
> range of 0-9 as a char? I understand it's simple enough to write in a
> function, but I wonder if there's a more general approach.

A character is number (are they called scalars? I forget) and as such you
can do math on them.

I take it you have a number such as 0 and you want to make this become the
character '0'. This is fairly simple since they are both types of numbers,
you can just add them. If you add 0 to the character '0' you get the value
for the character '0'. Add 1 and you get the value for the character '1',
etc...

So,

int MyNumber = 5;
char MyChar = '0' + MyNumber;
MyChar will now contain the character '5'.

If you are trying to do something else plese explain.

BobR
Guest
Posts: n/a

 11-09-2006

Eric wrote in message ...
>Is there a simple, standard statement that will reinterpret an int in
>the range of 0-9 as a char? I understand it's simple enough to write in
>a function, but I wonder if there's a more general approach.

In case the other answers were not what you wanted:

int num( 9 );
char cnum( num );
or insure the int will fit in a char:
num &= 0x7F;
char cnum2( num );
or if you need to assign:
cnum = static_cast<char>( num );

Be aware that 'char' may be 'unsigned char' or 'signed char' depending on
implementation/OS.
You can check which is used (among other ways):

#include <limits>
{
std::cout <<"numeric_limits<char>::max() ="
<<int(std::numeric_limits<char>::max())<<std::endl ;
std::cout <<"numeric_limits<char>::min() ="
<<int(std::numeric_limits<char>::min())<<std::endl ;

std::cout <<"numeric_limits<unsigned char>::max() ="
<<int(std::numeric_limits<unsigned char>::max())<<std::endl;
std::cout <<"numeric_limits<unsigned char>::min() ="
<<int(std::numeric_limits<unsigned char>::min())<<std::endl;
}

If the outputs match, 'char' == 'unsigned char'.

[ if you knew all this already, sorry. Maybe it might help some newbie.]
--
Bob R
POVrookie

peter koch
Guest
Posts: n/a

 11-09-2006

BobR skrev:
[snip]
>
> Be aware that 'char' may be 'unsigned char' or 'signed char' depending on
> implementation/OS.

unsigned char, signed char and (plain) char.

/Peter
[snip]

Nate Barney
Guest
Posts: n/a

 11-09-2006
Gavin Deane wrote:
> Eric wrote:
> > Is there a simple, standard statement that will reinterpret an int in
> > the range of 0-9 as a char? I understand it's simple enough to write in
> > a function, but I wonder if there's a more general approach.

>
> If you add an int in the range 0 to 9 to the char '0' you are
> guaranteed to get the appropriate character in the range '0' to '9'.

Doesn't that depend on the character set you're using? I know ASCII
has the digits in a contiguous range, and I believe EBCDIC does as
well, but it is conceivable that a character set could be devised that
does not have this property.

Nate

BobR
Guest
Posts: n/a

 11-09-2006

peter koch wrote in message ...
>
>BobR skrev:
>[snip]
>>
>> Be aware that 'char' may be 'unsigned char' or 'signed char' depending on
>> implementation/OS.

>
>unsigned char, signed char and (plain) char.
>
>/Peter

Thanks for cleaning up that poor wording on my part.

"I know you believe you understand what you think I said, but, I'm not sure
you realize that what you heard is not what I meant!"
--
Bob R
POVrookie

Default User
Guest
Posts: n/a

 11-09-2006
Nate Barney wrote:

> Gavin Deane wrote:
> > Eric wrote:
> > > Is there a simple, standard statement that will reinterpret an
> > > int in the range of 0-9 as a char? I understand it's simple
> > > enough to write in a function, but I wonder if there's a more
> > > general approach.

> >
> > If you add an int in the range 0 to 9 to the char '0' you are
> > guaranteed to get the appropriate character in the range '0' to '9'.

>
> Doesn't that depend on the character set you're using? I know ASCII
> has the digits in a contiguous range, and I believe EBCDIC does as
> well, but it is conceivable that a character set could be devised that
> does not have this property.

It's required by the standard. Under section 2.2 (Character Sets) part
3:

In both the source and execution basic character sets, the value of
each character after 0 in the above list of decimal digits shall be one
greater than the value of the previous.

Brian

Gavin Deane
Guest
Posts: n/a

 11-10-2006

Default User wrote:
> Nate Barney wrote:
>
> > Gavin Deane wrote:
> > > Eric wrote:
> > > > Is there a simple, standard statement that will reinterpret an
> > > > int in the range of 0-9 as a char? I understand it's simple
> > > > enough to write in a function, but I wonder if there's a more
> > > > general approach.
> > >
> > > If you add an int in the range 0 to 9 to the char '0' you are
> > > guaranteed to get the appropriate character in the range '0' to '9'.

> >
> > Doesn't that depend on the character set you're using? I know ASCII
> > has the digits in a contiguous range, and I believe EBCDIC does as
> > well, but it is conceivable that a character set could be devised that
> > does not have this property.

>
> It's required by the standard. Under section 2.2 (Character Sets) part
> 3:
>
> In both the source and execution basic character sets, the value of
> each character after 0 in the above list of decimal digits shall be one
> greater than the value of the previous.

Which standard are you quoting? 2.2/3 in the 1998 C++ standard doesn't
say that.

While I have seen enough independent sources state that this
requirement is standard to be confident restating it to the OP in this
thread, I don't think I have ever seen it in a standard for myself. I
have wondered whether that is because C++ inherits the requirement from
the C standard.

Gavin Deane

Pete Becker
Guest
Posts: n/a

 11-10-2006
Gavin Deane wrote:
>
> Which standard are you quoting? 2.2/3 in the 1998 C++ standard doesn't
> say that.
>

The 1998 standard was replaced by the 2003 standard.

--

-- Pete
Roundhouse Consulting, Ltd. -- www.versatilecoding.com
Author of "The Standard C++ Library Extensions: a Tutorial and
www.petebecker.com/tr1book.