bit96 skrev: ↑26 augusti 2022, 11:29:09
När en variabel 'slår om' till noll igen så får man naturligtvis ingen varning för det eftersom det enligt standard skall vara just så att den slår om.
Alltså att t.ex. en unsigned 16-bitars int går till max 65535 sen slår den om till 0.
Obs att C-standarden endast säger att "unsigned int" (och större) slår om.
För "int" så blir det istället "undefined behaviour", vilket C-kompilatorn har rätt att ignorera.
Det betyder att det faktiskt kan bli galet numeriskt fel på sätt som inte går att förutse.
En anledning till detta är att C också stödjer ovanliga processorer och microcontrollers som inte lagrar "signed"-typer i
tvåkomplementsform, eller som implementerar
"mättad arithmetic" (eller var de nu heter på svenska, alltså där resultatet blir ett MAX-värde och inte slår om).
Obs också att "unsigned"-typer mindre än "unsigned int" alltid förlängs till "int" i beräkningar — och
inte till unsigned int. Det betyder att högre bittar ligger kvar, och att resultatet kan bli negativt eller
undefined.
Därför bör man vara noga med att cast'a till "unsigned int", och ev. maska om det behövs för att vara säker på att det ska slå om korrekt som en mindre typ.