#include<stdio.h>
int main()
{
unsigned char c;
c = 300;
printf("%d",c);
return 0;
}
Является ли вывод каким-либо образом предсказуемым или неопределенным?
Вопрос
#include<stdio.h>
int main()
{
unsigned char c;
c = 300;
printf("%d",c);
return 0;
}
Является ли вывод каким-либо образом предсказуемым или неопределенным?
Извините за первый ответ, вот объяснение из стандартов С++ :)
Это предсказуемо. В этом коде нужно обратить внимание на два момента: во-первых, присвоить значение, которое не может содержать тип unsigned char:
unsigned char c;
c = 300;
3.9.1 Основные типы (стр. 54)
Целые числа без знака, объявленные беззнаковыми, должны подчиняться законам арифметики по модулю 2n, где n - количество битов в представлении значения этого конкретного размера целого числа. не переполняется, потому что результат, который не может быть представлен результирующим целочисленным типом без знака, уменьшается по модулю числа, которое на единицу больше, чем наибольшее значение, которое может быть представлено результирующим целочисленным типом без знака.
В принципе:
c = 300 % (std::numeric_limits<unsigned char>::max() + 1);
Во-вторых, передать %d в строке формата printf для печати переменной unsigned char.
Этот ysth все сделал правильно;) Неопределенного поведения нет, потому что рекламное преобразование из unsigned char в int происходит в случае variadic arguments!
Примечание: вторая часть ответа представляет собой перефразировку того, что было сказано в комментарии этого ответа, но изначально это не мой ответ.
Результат задания должен быть предсказуем:
3.9.1
4 Целые числа без знака, объявленные беззнаковыми, должны подчиняться законам арифметики по модулю 2n, где n - количество битов в представлении значения целого числа определенного размера.17)
17) Это означает, что беззнаковая арифметика не переполняется, потому что результат, который не может быть представлен результирующим беззнаковым целым типом, уменьшается по модулю числа, которое на единицу больше, чем наибольшее значение, которое может быть представлено результирующим беззнаковым целым типом.
Кроме того, sizeof(char) определяется как 1, а sizeof(unsigned char) = sizeof(char), поэтому вы должны увидеть один и тот же результат независимо от реализации (при условии, что у вас нет байтов с забавными размерами, отличными от 8).
Однако предупреждение сообщает вам, что результат, вероятно, не такой, как вы предполагали (например, возможно, вы переоценили размер беззнакового типа?). Если это то, что вы имели в виду, почему бы не написать 300 % (1 << CHAR_BIT) (при условии, что 300 имеет какое-то значение для вас)?
Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.