2

As I know C enum is unsigned integer, but this may vary by implementation. What type should I use for the enum in binary representation?

*PS 'binary representation' means byte-array. I want to serialize enum values to socket to inter-operate with other programs.

eonil
  • 83,476
  • 81
  • 317
  • 516
  • 2
    `enum` is an integer type; it's not unsigned. What do you mean by "enum in binary representation"? Can you provide an example? Do you mean you want a type suitable for, say, bitmasks? – jamesdlin Aug 18 '10 at 06:32
  • Your question is not very clear. Note: _The expression that defines the value of an enumeration constant shall be an integer constant expression that has a value representable as an int._ Assuming `enum`s are `unsigned int` is a not correct. – dirkgently Aug 18 '10 at 06:33
  • I updated my question. Sorry for unclarity. – eonil Aug 18 '10 at 06:37

3 Answers3

3

It's up to the compiler to use an int to represent an enum type, or a long if an int is not sufficient to hold all the values of the enum.

If you know that all your enum values can be represented by an int, then you can safely use int as the binary representation of your enum values.

Didier Trosset
  • 36,376
  • 13
  • 83
  • 122
  • You're right. I have to know exact spec of my compiler. I opened a new question for this: http://stackoverflow.com/questions/3509552/whats-the-data-type-of-c-enum-of-clang-compiler – eonil Aug 18 '10 at 06:43
  • Hm, I don't think that it may be `long` for that reason, but maybe the specification allows it to be `long`. All enumeration type constants are by definition `int`, so `int` will always be able to hold all values. – Jens Gustedt Aug 18 '10 at 06:57
1

As enums are just fancy ways to set integers, you should go for an integer type big enough to store all you enum values. Normally, a char should suffice and then there are no serialization issues. But I'd go for a short or a long instead. When serializing, I'd use ntohs/htons or ntohl/htonl (see their man pages) to always make sure the serialization is in network byte order and the deserialization is in host byte order.

DarkDust
  • 90,870
  • 19
  • 190
  • 224
0

How about xdr - library routines for external data representation?

Reinventing the wheel rarely produces something better.

domen
  • 1,819
  • 12
  • 19