• 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

VPS Starter Arubacloud
0 głosów
142 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 (251,170 p.)
edycja 20 sierpnia 2020 przez VBService

1 odpowiedź

+1 głos
odpowiedź 20 sierpnia 2020 przez Oscar Nałogowiec (29,290 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 88 wizyt
pytanie zadane 6 maja 2023 w C i C++ przez Dani Obywatel (1,420 p.)
+1 głos
2 odpowiedzi 575 wizyt
pytanie zadane 28 stycznia 2018 w C i C++ przez Nortalf Użytkownik (880 p.)
0 głosów
0 odpowiedzi 86 wizyt
pytanie zadane 19 listopada 2023 w C i C++ przez Kamil bachan Nowicjusz (120 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...