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

Unsigned w C

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
517 wizyt
pytanie zadane 1 czerwca 2015 w C i C++ przez gabon95 Nowicjusz (160 p.)
Zagadka na którą do tej pory nie znalazłem odpowiedzi

Mamy int i =3; (i*(-4))%11=-1 >> normalnie
jeżeli zminimy na unsigned int i =3; (i*(-4))%11=3;
Moje pytanie jak działa modulo na liczbach unsigned  ?
Próbowałem we wszystkie strony i nie wychodzi, szukałem odpowiedzi na to zagadnienie, ale nigdzie nie znalazłem jednoznacznej. Słyszałem coś że unsigned jest zapisany w systemie U2, ale nic więcej.

1 odpowiedź

+2 głosów
odpowiedź 1 czerwca 2015 przez draghan VIP (106,230 p.)

Jakiego wyniku się spodziwałeś? :)

Mnożysz zmienną unsigned przez liczbę ujemną, więc przekraczasz jej zakres. :)

Polecam mały eksperyment:

#include <stdio.h>

int main()
{
    int i = 3 * (-4);
    unsigned j = 3 * (-4);
    printf("%d %u", i, j);
    return 0;
}

:)

komentarz 1 czerwca 2015 przez gabon95 Nowicjusz (160 p.)
No okej tylko potrzebny sposób jak to ręcznie policzyć na kolokwium. Ogólnie wygląda tak, że jest funkcja i muszę wypisać na kartce wszystkie "wydruki", w tym wypadku rekurencja :

#include<stdio.h>
#include<stdlib.h>
unsigned int rozszyfruj (unsigned int kj,
 short int jh){
 unsigned int dj;
 if (kj == 0)
 return 11;
 printf ("\n[%d]kj", (-4 * kj + 3 * jh) % 11);
 dj = -3 * kj + 5 * rozszyfruj (kj - 1, jh + 1);
 printf ("\ndj%d", -6 * jh + -5 * dj);
 return dj;
}
int main()
{
    printf ("\nqk%d",
    rozszyfruj (3, 0));
    return 0;
}
komentarz 1 czerwca 2015 przez draghan VIP (106,230 p.)
Operator modulo musi działać tak samo dla zmiennych signed i unsigned (chodzi mi tutaj o sam wynik, nie zaś konkretną realizcję takiego działania ;).

Szczerze powiedziawszy, nie można z góry okreslić wyniku dzielenia modulo na liczbie, która przekroczyła swój zakres "w górę".
C jest językiem, który z założenia jest przenośny - pisze się w nim programy zarówno na 8-bitowe mikrokontrolery, jak i PCty, gdzie siłą rzeczy zakres zmiennej 8-bitowej i 64-bitowej jest inny.

Nawet patrząc tylko na implementacje PCtowe, ilość pamięci przydzielanej do danego typu zmiennej uzależniona jest od systemu operacyjnego (przy "zwykłych" intach to jeszcze się w miarę zgadza, natomiast już przy longach zaczyna być różnie).

W takim wypadku musisz niestety znać specyfikację danego urządzenia, na które ów program jest pisany. Albo dopytać prowadzącego, jaki zakres ma mieć zmienna unsigned, żeby wiedzieć, jak sobie poradzić z przekroczeniem zakresu, skoro mnożysz przez liczbę ujemną.

A jesteś pewny, że algorytm wymaga mnożenia unsigned przez wartość ujemną?
komentarz 1 czerwca 2015 przez gabon95 Nowicjusz (160 p.)
Doobra już wiem wystarczy do 2^32(całego zaktesu) dodać tę liczbę ujemną czyli odjąć i policzyć modulo i tedy wychodzi :)
komentarz 1 czerwca 2015 przez draghan VIP (106,230 p.)
Przy założeniu 32-bitowej zmiennej - masz odpowiedź. :) Powodzenia na kole! ;)
komentarz 1 czerwca 2015 przez gabon95 Nowicjusz (160 p.)
Ta jest w poleceniu, że int ma 4 bajty.

Dzięki za pomoc :D

Podobne pytania

+1 głos
2 odpowiedzi 783 wizyt
pytanie zadane 27 czerwca 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
–1 głos
2 odpowiedzi 2,104 wizyt
pytanie zadane 2 stycznia 2017 w C i C++ przez Arkadiusz Sieczak Początkujący (400 p.)
0 głosów
2 odpowiedzi 1,409 wizyt
pytanie zadane 22 grudnia 2019 w C i C++ przez Hubertius Bywalec (2,970 p.)

93,187 zapytań

142,201 odpowiedzi

322,012 komentarzy

62,514 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2365p. - dia-Chann
  2. 2326p. - Łukasz Piwowar
  3. 2315p. - Łukasz Eckert
  4. 2269p. - Tomasz Bielak
  5. 2235p. - Łukasz Siedlecki
  6. 2006p. - Michal Drewniak
  7. 2006p. - rucin93
  8. 1964p. - CC PL
  9. 1946p. - Adrian Wieprzkowicz
  10. 1901p. - Mikbac
  11. 1744p. - rafalszastok
  12. 1734p. - Anonim 3619784
  13. 1586p. - Dawid128
  14. 1520p. - Marcin Putra
  15. 1480p. - ssynowiec
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...