Problem z negacją

0

Mam problem zadeklarowałem w programie zmienną char nadałem jej wartość 15, następnie zanegowałem i wychodzą bzdury zamiast 245 otrzymuje liczbę promowaną do czegoś niebotycznie dużego, no chyba że to problem z printf

 #include <stdio.h>

int main(void)
{
	short int a;
	a = 15;
	short int b;
	b = ~a;
	printf("%u",b);
}

Wynikiem jest wartość int mniejsza chyba o 10 czy o 15, 4294967280, chce otrzymać liczbę 245

0

czy %u nie oznacza unsigned? zrzutuj do unsigned i wtedy próbuj

1

Nie zrzutuj tylko wypisuj jak człowiek %hi ;/

0

A co oznacza %hi, bo wynik dalej jest zły, kompilator to mingw, negacja liczby 15 powinna dać 245, a daje maksymalny zakres int-a - 15, nawet kalkulator windowsowy podaje takie same bzdury, system to win10

1

No, zgłoś buga do Microsoftu.

3

Nie wiem jak chcesz osiągnąć 245.

1510 to 11112.

Zakładając 16-bitowy short int i 32-bitowy unsigned int/int:

a to 0000 0000 0000 11112
b to ~a, czyli 1111 1111 1111 00002 (czyli -1610 w U2)
printf promuje (integer promotion) przekazane wartości. Tutaj do int, czyli argument printf to:
int o wartości 1111 1111 1111 1111 1111 1111 1111 00002 (czyli -1610 w U2)
wypisujesz go jako unsigned int, czyli 429496728010

24510 to 1111 01012

Dla 8 bitów ~1510 to 1111 00002, czyli 24010

Jak chcesz z 15 zrobić 245 to sobie po prostu dodaj 230.

PS: char i short to różne typy, prawie zawsze różnej wielkości (najczęściej odpowiednio 8 i 16 bitów). Ich unsigned i signed odpowiedniki mają tę samą wielkość.

0

o to chodzi?

https://ideone.com/VBsLEi

1 użytkowników online, w tym zalogowanych: 0, gości: 1