Sida 1 av 1
en fråga på int
Postat: 25 augusti 2022, 16:47:24
av newbadboy
Ofta gör jag olika räknare som jag deklarerar som int. men jag har upptäct att det inte funkar om jag tex ska räkna upp till 100k. Nedan har jag en typisk kod. Här räknar upp till 60K och dey funkar fin men sätter jag som innan nämnt 100k så uppfylls aldrig If satsen.
Kod: Markera allt
STANDBY_CTRL(){
stdby++;
Vadc=ADC_Read(17); //Kolla sid 244 i datablad ANC1=>010001=> 17
if(Vadc>3)
stdby=0;
if(stdby>60000){
MUTE=0; //Off state
PREAMP_ON=0;
AMP_SD=1;
delay_ms(100);
LED=0;
while(Vadc<3){
Vadc=ADC_Read(17);
delay_ms(10);
}
PREAMP_ON=1; //On state
delay_ms(100);
AMP_SD=0;
delay_ms(500);
MUTE=1;
}
Re: en fråga på int
Postat: 25 augusti 2022, 16:50:31
av AndLi
En int på uc är ibland 16 bitar alltså 0-65535 alt +- 32767...
Så öka till en större datatyp så kommer det funka...
Ett tips är att deklarera med uint16_t istället för uint så är det tydligare vilken storlek du får.
Re: en fråga på int
Postat: 25 augusti 2022, 16:58:15
av newbadboy
Aehhh det har jag missat helt. Googlade hur stort int var och då var det betydligt större
Re: en fråga på int
Postat: 25 augusti 2022, 18:18:48
av Icecap
Och bara int som typ är farlig. Beroende på kompiler kan den vara allt från 8 bit till 64 bit.
Det är ytterligare en grund till att vara specifik med datatyp.
En int kan oftast vara av den typ som det är enklast för processorn att läsa/skriv.
Re: en fråga på int
Postat: 25 augusti 2022, 18:19:21
av Shimonu
Storleken av en int är inte definierat exakt utan beror på vilken processorarkitektur man kör på.
Re: en fråga på int
Postat: 25 augusti 2022, 18:22:24
av ojz0r
Lite enkelt så kan man säga attInt brukar vara "native" längd på minnet för respektive platform. För 64-bitars processorer brukar den vara just 64-bitar medan en 8-bitars MCU är en int i regel 8-bitar.
Använder man standard intarna som AndLi skrev så ser man bitlängden på ett enkelt sätt.
Re: en fråga på int
Postat: 25 augusti 2022, 18:26:55
av newbadboy
Ja då är det utrett. Tackar tackar
Re: en fråga på int
Postat: 25 augusti 2022, 20:28:46
av GFEF
I många fall är standard + - tal det vill säga en av tecknen används för att ange detta.
Om talet inte kan vara -.
Kan unsigned int ger dubbelt så stora tal som int.
Många programmerings språk följer C standar.
Där anges endast relativ storlek char = tecken minst int större.
På 8-bitar bukar detta betyd char -128 till 127 unsigned char 0 till 255.
Något att tänka på för räknar variabel variabler....
Re: en fråga på int
Postat: 25 augusti 2022, 22:02:57
av agehall
Kolla upp stdint.h. Använd alltid datatyper med specifik storlek, så som uint32_t för tal som aldrig ska vara negativa och sint32_t för tal som ska kunna vara negativa.
Använder man dessa datatyper slipper man spännande överraskningar när man byter till en plattform som har fler/färre bitar.
Re: en fråga på int
Postat: 26 augusti 2022, 06:59:04
av FormerMazda
newbadboy skrev: ↑25 augusti 2022, 16:58:15
Aehhh det har jag missat helt. Googlade hur stort int var och då var det betydligt större
Lägger bara till att int är förkortning av integer som betyder heltal.
Alltså en datatyp utan decimaler. Säger inget om hur stor den kan vara, därav att en googleträff kan säga att den kan vara jättestor.
Tar man i från tårna med en 64bit integer så kan den vara från -9 223 372 036 854 775 808 till 9 223 372 036 854 775 807.
Signed och unsigned är om den kan gå negativt eller inte. (sint / uint)
En del väljer att kalla de olika storlekarna på integers för olika saker. double integer, word, long, mm.
Re: en fråga på int
Postat: 26 augusti 2022, 11:29:09
av bit96
Enligt standard är:
char minst 8 bitar
short minst 16 bitar
int minst 16 bitar
long minst 32 bitar
long long minst 64 bitar
Dessutom får de inte "gå om varandra" så om t.ex. 'int' är 64 bitar måste både 'long' och 'long long* också vara minst 64 bitar.
Unsigned och signed är alltid lika långa.
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.
Om sedan aktuell kompilator följer standard är en annan fråga.
Läs i filen 'limits.h' som innehåller makron med min- och max-gränser m.m. för aktuell kompilator.
newbadboy skrev: ↑25 augusti 2022, 16:58:15
Aehhh det har jag missat helt. Googlade hur stort int var och då var det betydligt större
Alltså, googla inte utan titta i 'limits.h' vad som gäller för din kompilator. Google vet inte vilken kompilator du har. Eller ja, det vet Google m.fl. naturligtvis...

Re: en fråga på int
Postat: 26 augusti 2022, 12:12:38
av newbadboy
Uppfattat.

Re: en fråga på int
Postat: 26 augusti 2022, 12:38:07
av Findecanor
ojz0r skrev: ↑25 augusti 2022, 18:22:24
För 64-bitars processorer brukar den vara just 64-bitar medan en 8-bitars MCU är en int i regel 8-bitar.
På praktiskt taget alla 64-bitsplattformar är en "int" faktiskt fortfarande 32 bittar. Processorerna har instruktioner också för 32 bittars heltal, vilka används för just "int" och "unsigned int".
Det är väldigt ovanligt med CPU-arkitekturer som bara stödjer 64-bittars heltal. (jag tror jag har sett
en men kan inte komma på vad den hette ...)
En sak som skiljer sig dock, är "long int". Under Windows är den typen 32-bit för bakåtkompatibilitet med 32-bittars Windows, men annars brukar "long int" vara 64-bit på 64-bittarsplattformar.
På 8-bittars AVR brukar "int" vara 16-bittar, men det ska gå att sätta till 8 med en kompilatorflagga.
Jag brukar i min kod använda "int8_t" överrallt och hoppas att kompilatorn är smart nog att optimera bort förlängning till 16 i de flesta uttryck.
Re: en fråga på int
Postat: 26 augusti 2022, 12:50:42
av Findecanor
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.
Re: en fråga på int
Postat: 26 augusti 2022, 13:17:49
av ojz0r
@Findecanor: Tack för rättelsen.