• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zmienna typu long long nie inkrementuje się do 8 bajtów

Cloud VPS
0 głosów
200 wizyt
pytanie zadane 20 sierpnia 2020 w C i C++ przez th3r4t3l Nowicjusz (120 p.)

Skoro zmienna typu `unsigned long long` przechowuje wartości od 0 do 18446744073709551615 czyli do 0xFFFFFFFFFFFFFFFF (8 bajtów) to dlaczego zeruje się po 4 bajtach [0xFFFFFFFF] i nie liczy do 8 bajtów [0xFFFFFFFFFFFFFFFF] ???
Napisałem przykładowy kod i tak mi się dzieje

#include<conio.h> 
#include<stdio.h> 

using namespace std;

unsigned int i=0;
unsigned long long licznik=0;

int main() 
{
	printf("Rozmiar typu short    : %d bytes.\n",sizeof(unsigned short));
    printf("Rozmiar typu int      : %d bytes.\n",sizeof(unsigned int));
    printf("Rozmiar typu long     : %d bytes.\n",sizeof(unsigned long));
    printf("Rozmiar typu long long: %d bytes.\n\n",sizeof(unsigned long long));	
	while(i!=2)
	{
		licznik++;
		if(licznik%0xFFFFFFF==0)
			printf("Licznik: 0x%0.16X\r",licznik); 
			// Wyswietl stan licznika co 0xfffffff = 268 435 455
			// Wyswietlanie ciągłe mocno spowalnia program.
		if(licznik==0xFFFFFFFFFFFFFFFF) // = 18446744073709551615 
		{
			licznik=0;
			i++;
		}
	}
} 

Czy ktoś to może wytłumaczyć????

Piszę to w devcpp [TDM-GCC 4.9.2 release 32-bit]

1
komentarz 20 sierpnia 2020 przez VBService Ekspert (256,600 p.)
edycja 20 sierpnia 2020 przez VBService

1 odpowiedź

+1 głos
odpowiedź 20 sierpnia 2020 przez Oscar Nałogowiec (29,360 p.)
Kilka spraw:

printf to nie jest funkcja przeciążona, nie zna typów swoich parametrów - kolejne specyfikatory formatu oznaczają argument jakiego typu ma ściągnąć ze stosu parametrów. Tyko kompilator może to jako ostatni sprawdzić. GCC daje na taką okoliczność ostrzeżenie, daj -Wall do polecenia kompilacji, albo spróbuj llX.

rożna stałe (literały) mają też swoje typy. Daj na końcu LL.
komentarz 21 sierpnia 2020 przez th3r4t3l Nowicjusz (120 p.)

Zmieniłem:

unsigned long long suma=0;

na:

#include <inttypes.h>
uint64_t suma=0;

i nadal nie działa

"%llx"  w printf też nic nie pomaga

printf("suma: 0x%0.16llx\n",suma);
printf("suma: %#llx\n",suma);
printf("suma: 0x%llX\n",suma);

czego jeszcze mogę spróbować ?

Podobne pytania

0 głosów
0 odpowiedzi 148 wizyt
pytanie zadane 6 maja 2023 w C i C++ przez Dani Obywatel (1,450 p.)
+1 głos
2 odpowiedzi 706 wizyt
pytanie zadane 28 stycznia 2018 w C i C++ przez Nortalf Użytkownik (880 p.)
0 głosów
0 odpowiedzi 132 wizyt
pytanie zadane 19 listopada 2023 w C i C++ przez Kamil bachan Nowicjusz (120 p.)

93,464 zapytań

142,459 odpowiedzi

322,730 komentarzy

62,844 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...