Приведение к беззнаковому целому, затем обратное приведение, C

Если у меня есть стек S, заполненный целыми числами со знаком, я хочу сделать следующее: вытолкнуть два значения и привести их к целому без знака, затем сложить их вместе, а затем вернуть сумму SIGNED. Я сделал следующее, но я не знаю, правильно ли это:

unsigned int x = (unsigned int)pop(S)
unsigned int y = (unsigned int)pop(S)
int sum = x+y
push(S, sum);
pc++

Я на правильном пути? Кроме того, может ли кто-нибудь объяснить мне немного о явном кастинге? Спасибо.


person de1337ed    schedule 02.12.2011    source источник
comment
Зачем вообще нужен кастинг?   -  person Oliver Charlesworth    schedule 02.12.2011
comment
какой тип возвращает pop(S)?   -  person Roman Byshko    schedule 02.12.2011
comment
pop возвращает 32-битное целое число   -  person de1337ed    schedule 02.12.2011


Ответы (1)


Вы правы в том смысле, что ваш код делает именно то, о чем вы говорите. Настоящий вопрос заключается в том, действительно ли это то, чего вы хотите достичь.

Отрицательное число, приведенное к типу unsigned int, становится очень большим положительным числом. Например, отрицательная единица становится наибольшим положительным целым числом, которое может быть выражено в беззнаковом целом после приведения к беззнаковому (попробуйте!). Когда вы складываете два отрицательных числа, которые были приведены к беззнаковому, вы гарантированно получите переполнение. Если это действительно то, что вы пытаетесь сделать, ваш код определенно делает это.

person Sergey Kalinichenko    schedule 02.12.2011
comment
Да, я пытаюсь сделать это. Но всякий раз, когда я печатаю, например, f(%d\n, x), он по-прежнему дает мне целое число со знаком, поэтому я не знаю, работает ли то, что я делаю. - person de1337ed; 02.12.2011
comment
@ de1337ed de1337ed Это потому, что вам нужно указать printf, чтобы он не преобразовывал ваш неподписанный обратно в подписанный: printf("%u\n", x). - person Sergey Kalinichenko; 02.12.2011
comment
Даже если вы не сделаете сложение, вы получите переполнение. Следующее вызывает поведение, определяемое реализацией: (int)(unsigned int)-1. - person Oliver Charlesworth; 02.12.2011
comment
Вы не можете доверять тому, что говорит вам printf, потому что глупо сопоставлять тип в строке формата с типом в переданном аргументе. Вы можете передать число с плавающей запятой и попытаться напечатать его с помощью %d, и printf с радостью попытается это сделать. Попробуйте выполнить печать с помощью %u\n. - person Paul Tomblin; 02.12.2011
comment
В этом есть смысл. Еще один быстрый вопрос: нужно ли мне делать unsigned int x = (unsigned int)pop(S) или достаточно unsigned int x = pop(S)? - person de1337ed; 02.12.2011
comment
@ de1337ed de1337ed Я думаю, вы увидите предупреждение о преобразовании со знаком / без знака, если вы пропустите приведение, но код будет скомпилирован и запущен так же. - person Sergey Kalinichenko; 02.12.2011