[C] datatype met slechts 9 mogelijkheden *

Pagina: 1
Acties:

  • vanderP
  • Registratie: Oktober 2001
  • Laatst online: 21-05 14:48
ik heb voor het programeren van een microcontroller, een data type nodig.
Die die een bereik heeft van 0 , 1 , 2 , 3 , 4 .....8.

Voorbeeld
1+1=2
...
...
...
8+1=0
0-1=8

Hoe kan ik dit het makkelijkste maken, ik heb gekeken naar SHRT_max en SHRT_min ,maar hier mee kreeg ik het niet voor elkaar.

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:25
Dat heeft niets met een data-type te maken.
Kijk eens naar het octale talstelsel en hoe je dat in C kunt gebruiken.

Hmmm, octaal is van 0 -> 7 zeker?

[ Voor 34% gewijzigd door whoami op 28-04-2004 14:34 ]

https://fgheysels.github.io/


  • Nvidiot
  • Registratie: Mei 2003
  • Laatst online: 11-01 23:32

Nvidiot

notepad!

Optellen / vermenigvuldigen gewoon mod 8 doen. Aftrekken is iets lastiger (lees: zie ik zo snel even niet)

What a caterpillar calls the end, the rest of the world calls a butterfly. (Lao-Tze)


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:01

Janoz

Moderator Devschuur®

!litemod

Die 8 is een beetje vreemd. Als dit 7 was geweest kon je het resultaat makkelijk ANDen met 8.

Verder snap ik je probleem niet helemaal en heb je een nogal magere topicstart/titel. Lees ook even de quickstart van de programming faq.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Nvidiot schreef op 28 april 2004 @ 14:30:
Optellen / vermenigvuldigen gewoon mod 8 doen. Aftrekken is iets lastiger (lees: zie ik zo snel even niet)
Ik zou er toch maar mod 9 van maken, jouw oplossing maakt de range van 0 t/m 7
Aftrekken: op het moment dat de uitkomst negatief is kan je dit weer van 9 aftrekken

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 25-05 20:56
Je bedoelt gewoon integer arithmetic modulo 9? Als je een modulo operator ter beschikking hebt is het probleem snel opgelost; zoniet, dan moet je het waarschijnlijk doen met een vergelijking en het resultaat aanpasen:

code:
1
2
3
4
5
add(a, b) -- a en b zijn modulo 9
  r = a + b
  if(r > 9)
     r = r - 9
  return r

Aftrekken werkt soortgelijk; als het werken met negatieve getallen lastig is, moet je bedenken dat (modulo 9), geldt: a - b = a + 9 - b (het resultaat van de tweede expressie is zeker positief).

Verwijderd

Soultaker schreef op 28 april 2004 @ 14:40:
Je bedoelt gewoon integer arithmetic modulo 9? Als je een modulo operator ter beschikking hebt is het probleem snel opgelost;
Het i.d.d. gewoon een modulo 9 operatie. De modulo operator in C is % dus:

C:
1
2
3
4
int mod9add(int a, int b)
{
    return (a + b) % 9;
}

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 25-05 20:56
Maar pas op dat je niet probeert om het verschil te schrijven als (a - b) % 9, want dat werkt niet zoals je verwacht! Het antwoord is waarschijnlijk negatief en wat je er precies uit krijgt is compiler-afhankelijk (hoewel dat in C99 wel vastgelegd is).

Het is daarom aan te raden om het verschil als (a + 9 - b) te schrijven.

[ Voor 14% gewijzigd door Soultaker op 28-04-2004 16:36 ]


Verwijderd

Soultaker schreef op 28 april 2004 @ 16:35:
Maar pas op dat je niet probeert om het verschil te schrijven als (a - b) % 9, want dat werkt niet zoals je verwacht! Het antwoord is waarschijnlijk negatief en wat je er precies uit krijgt is compiler-afhankelijk (hoewel dat in C99 wel vastgelegd is).

Het is daarom aan te raden om het verschil als (a + 9 - b) te schrijven.
Accoord, maar het is maar wat je verwacht na een modulo operatie, een "common residue" a la Gauss (altijd positief) of een "minimal residue" (kleinste rest, dus kan ook negatief zijn), zie hier voor het verschil. In hardware is een minimal residue efficienter te implementeren; het overgrote deel van de ALU's levert dan ook een minimal residue. (pre C99) C neemt simpelweg de operatie die de hardware levert.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 25-05 20:56
Met modulo arithmetic wil je dat congruente getallen dezelfde representatie hebben, zodat je ze kan vergelijken. In dit geval ligt het dus voor de hand dat je nooit getallen >=9 of <0 wilt hebben. -1 =~ 8 mod 9, maar dat is lastig vergelijken zonder -1 om te schrijven naar 8.

In het algemene geval zijn de verschillende mogelijke manieren van afronden op zichzelf wel zinnig en hangt het er maar net van af welk gedrag je in een specifieke situatie wil hebben. Toch vind ik het onhandig dat in C89 er geen definitieve keuze is gemaakt, aangezien je dan nog steeds geen portable code kan schrijven die gebruik maakt van de modulo operator met een negatieve operand. Effectief kun je de hele constructie dus niet gebruiken (zonder compiler-specifieke code te schrijven).

  • vanderP
  • Registratie: Oktober 2001
  • Laatst online: 21-05 14:48
Thanks :)
Het werkt nu goed met die modulo functie.
En als ik aan de min kant kom tel ik er gewoon 9 bij op.
Pagina: 1