casting int to char

E

Eric

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.
 
G

Gavin Deane

Eric said:
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";
}

Does that answer your question?

Gavin Deane
 
J

Jim Langston

Eric said:
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.
 
B

BobR

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.]
 
P

peter koch

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

This answer is at best misleading. C++ has three character types:
unsigned char, signed char and (plain) char.

/Peter
[snip]
 
N

Nate Barney

Gavin said:
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
 
B

BobR

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

This answer is at best misleading. C++ has three character types:
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!"
 
D

Default User

Nate said:
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
 
G

Gavin Deane

Default said:
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
 
D

Default User

Gavin said:
Default User wrote:
Which standard are you quoting? 2.2/3 in the 1998 C++ standard doesn't
say that.

The one I have:

INTERNATIONAL ISO/IEC
STANDARD 14882
Second edition
2003-10-15
Programming languages - C++
Langages de programmation - C++

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.

I'd be rather surprised if it's not in the 1998 standard. It was in the
original C standard.



Brian
 
F

Frederick Gotham

Eric:
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.

Assuming "c" is an L-value char, and that "i" is an int:

c = (assert(i>=0 && i<=9),'0'+i);

In Release Mode, this will become:

c = ((void)0,'0'+i);
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top