[C] Unsigned enums?

Pagina: 1
Acties:
  • 165 views sinds 30-01-2008
  • Reageer

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Aanschouw onderstaand wonderbaarlijke code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

typedef enum moo {
  STRANGE = 6,
  CHARMING = 7
} moo;

struct oof {
  moo surface:3;
  int baz:5;
} x;

int main(void)
{
  x.surface = CHARMING;
  printf("%d\n", x.surface);
}


Als ik deze run op mijn MSVC compiler is x.surface -1. Als ik het op gcc compileer, is x.surface gewoon 7. Is er ook maar enig mogelijkheid om die bitstuffed waarde unsigned aan surface toe te kennen dat werkt in MSVC? Ik heb 3 bits, 7 moet zeker lukken :( (6 is -2, en pas bij 3 gaat het goed..ik ben dus 1 bit kwijt aan signedness :'( )


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Typecasten naar unsigned werkt niet?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
NMe84 schreef op donderdag 18 november 2004 @ 23:15:
Typecasten naar unsigned werkt niet?
Bedoel je zoiets als
"STRANGE = 6U,",
"STRANGE = (unsigned char)6," of
"x.surface = (unsigned)CHARMING;"
werken niet :/

Hoe ik het nu op MSVC heb opgelost kan je hieronder zien, maar dit wil ik helemaal niet. Moet ik nou MS gaan bashen })
code:
1
2
3
4
5
typedef unsigned char moo;
enum moo {
  STRANGE = 6,
  CHARMING = 7
};

[ Voor 32% gewijzigd door Darkvater op 18-11-2004 23:32 ]


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Misschien door de default chars unsigned te maken ? (=compiler optie)

Volgens mij frot de compiler het in de kleinste eenheid waar het nog in past.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
farlane schreef op donderdag 18 november 2004 @ 23:33:
Misschien door de default chars unsigned te maken ? (=compiler optie)

Volgens mij frot de compiler het in de kleinste eenheid waar het nog in past.
/J (Default char Type Is unsigned)
Gedaan; maar zonder resultaat.


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Ik gebruik ze niet zo vaak, maar ik dacht dat het teken van een bitfield implementatie-afhankelijk is. (Ook als je bijvoorbeeld een "int" declareert, die normaal gesproken zijn signed zou zijn.) Probeer dus eens "unsigned moo" in je declaratie te zetten?

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Is het heel erg belangrijk dat je 2 'ints' in 1 byte stopt? Anders vind ik dat je het jezelf erg moeilijk maakt, maar ja, wie ben ik ;)

"Beauty is the ultimate defence against complexity." David Gelernter


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Soultaker schreef op donderdag 18 november 2004 @ 23:42:
Ik gebruik ze niet zo vaak, maar ik dacht dat het teken van een bitfield implementatie-afhankelijk is. (Ook als je bijvoorbeeld een "int" declareert, die normaal gesproken zijn signed zou zijn.) Probeer dus eens "unsigned moo" in je declaratie te zetten?
Je kan geen modifiers bij een typedef toevoegen...

"Beauty is the ultimate defence against complexity." David Gelernter


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Macros schreef op donderdag 18 november 2004 @ 23:42:
Is het heel erg belangrijk dat je 2 'ints' in 1 byte stopt? Anders vind ik dat je het jezelf erg moeilijk maakt, maar ja, wie ben ik ;)
Jah, het moet :) . Ik zou het liever ook niet doen hoor ;)

Dus MS flamen maar? :|


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Alleen MS flamen als de C standaard zegt dat dat ding unsigned moet zijn. Ik denk dat het implementatie-afhankelijk is, en dan is de keuze van MS net zo geldig als van GNU.

Overigens snap ik niet waarom je dat veld niet gewoon unsigned definieert. Types gebruiken in bitfields is sowieso een beetje raar, omdat je het type beperkt tot een vast aantal bits. Zeg dan direct "unsigned : 3" dan geef je tenminste aan dat het een unsigned 3-bits waarde is.

[ Voor 3% gewijzigd door Soultaker op 18-11-2004 23:54 ]


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Misschien moet je in je struct ipv een enum een unsigned char declareren. Dat heb je minder type safety, maar ja, met 3 bits kan je ook niet zoveel ;)

"Beauty is the ultimate defence against complexity." David Gelernter


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

En anders heb je altijd nog 's werelds vieste oplossing:
C++:
1
2
3
#ifdef __MSVCPP
    var = ~var + 1;
#endif

Lelijk, doch effectief. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Macros schreef op donderdag 18 november 2004 @ 23:42:
Is het heel erg belangrijk dat je 2 'ints' in 1 byte stopt? Anders vind ik dat je het jezelf erg moeilijk maakt, maar ja, wie ben ik ;)
sterker nog, sizeof (oof) == sizeof (int) ;)
(onder MSVC++ dan)

[ Voor 4% gewijzigd door .oisyn op 19-11-2004 11:08 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Waarom maak je geen set/get functies die een enum accepteren en de bits setten/getten met een paar AND masks ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
farlane schreef op vrijdag 19 november 2004 @ 11:20:
Waarom maak je geen set/get functies die een enum accepteren en de bits setten/getten met een paar AND masks ?
Ik heb die ~var+1 geprobeerd, maar de waarde is dan gewoon -7 (als charming 7 is), en er wordt -1 toegekend aan de waarde. Over wat farlane zegt, het heel idee was om de heele bits-dingen door de compiler zelf te laten doen..maar ik denk dat het dan inderdaad iets anders moet worden helaas; zoals get/set.


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Dan kun je beter gewoon dat bitfield als unsigned declareren. Lijkt me stukken makkelijker, en in C boeit het toch niets of variabele een enum of een int of een bitfield is. Sowieso is het de vraag of een enum het juiste type is om te gebruiken, als de feitelijke waarde van belang is; dan zou je toch al meer naar een int moeten neigen.

[ Voor 34% gewijzigd door Soultaker op 19-11-2004 17:38 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik lees wel dit:
The bug is that gcc makes "an enum type be of type unsigned int (or maybe
unsigned char) rather than signed int as it should be according to K&R 2nd
edition section A8.4 pages 214-215."
Blijkbaar heeft MS het dus goed, en GCC fout? Ik heb geen C standaard hier; maar staat daarin dat een enum signed moet zijn?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Oh ik vind trouwens net een MSVC7 compliance bug: (is wel C++, geen C)

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>


enum BOOL { f=0, t=1 };
  struct A {
          BOOL b:1;
  };
  A a;

  void foo() {
          a.b = t;
          if (a.b == t)           // shall yield true
           { printf("Compiler ok!\n"); }
          else {
              printf("Compiler bugs!\n");
          }
  }

  int main(void) {
    foo();
    return 0;
  }


MSVC output hier "Compiler bugs!".

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
4 If the value true or false is stored into a bit-field of type bool  of
  any  size (including a one bit bit-field), the original bool value and
  the value of the bit-field shall compare equal.  If the  value  of  an
  enumerator is stored into a bit-field of the same enumeration type and
  the number of bits in the bit-field is large enough to  hold  all  the

  values of that enumeration type, the original enumerator value and the
  value of the bit-field shall compare equal.  [Example:
  enum BOOL { f=0, t=1 };
  struct A {
          BOOL b:1;
  };
  A a;
  void f() {
          a.b = t;
          if (a.b == t)           // shall yield true
          { /* ... */ }
  }
   --end example]

Verwijderd

Volgens mij is een enum signed dus is het gedrag van het eerste stukje code verklaarbaar. Soultaker heeft goede argumenten: als je met bitfields werkt, werk dan met bitfields van primitieven zoals unsigned char of int, dan weet je a) de signedness en b) de size(of) zeker.
(Die sizeof(struct oof) lijkt mij ook wel eens interessant om te weten.)

edit: verklaarbaar maar niet volgens de standaard dus :)
edit2: Verdorie, ik mis posts? Don't mind me, my browsercache is borked.

[ Voor 18% gewijzigd door Verwijderd op 19-11-2004 18:09 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
7.1.5.2 zegt implementation-defined

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

MSalters schreef op zaterdag 20 november 2004 @ 00:35:
7.1.5.2 zegt implementation-defined
Weet jij of 9.6.4 veranderd sinds de 1997 working paper? Volgens mij is dat namelijk een onbekende VC compiler 'bug' die ik net postte?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
N1638, April draft zegt ook hetzelfde
If the value true or false is stored into a bit-field of type bool of any size (including a one bit bit-field), the original bool value and the value of the bit-field shall compare equal. If the value of an enumerator is stored into a bit-field of the same enumeration type and the number of bits in the bit-field is large enough to hold all the values of that enumeration type, the original enumerator value and the value of the bit-field shall compare equal. [Example:
C++:
1
2
3
4
5
6
7
8
9
10
enum BOOL { f=0, t=1 };
struct A {
BOOL b:1;
};
A a;
void f() {
a.b = t;
if (a.b == t) // shall yield true
{ /* ... */ }
} 

—end example]
offtopic:
Nee, de nieuwe standaard is niet color coded ;)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
MSVC bug dus (bij mij is het fals). Iig bedankt voor de zeer hulpvolle en deskundige hulp van iedereen \o/


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge

Pagina: 1