Жаль, что вы не указали целевые параметры. Таким образом, для следующего я полагаю:
CHAR_BIT == 8
sizeof(int) >= 2
- не обивка биты
str
указует на действительные и инициированные памяти, правильно nul
-завершённые и не больше, чем INT_MAX
(в качестве альтернативы использовать size_t
для index - thanks @chux).
- и, возможно, другие предпосылки, которые мы склонны принимать за данные.
Это типичные для большинства современных реализаций.
Для sizeof(int) == 2
инициализатор представляет собой поведение, определенное реализацией, поскольку в качестве инициализатора используется константа unsigned int
. Для более широких int
это нормально. Вещи также усложняются, если (int)(0xFACA) + CHAR_MAX > INT_MAX
(арифметически, также относится только к 2 байтам int
).
Остальное зависит от реализации определенного поведения в более сложным образом:
1) Добавление str[i] + key
: Здесь str[i]
преобразуется в int
во-первых, добавление сделано как int
и дает int
результат.
2) Назначение str[i] = ...
: Здесь int
результат сложения преобразуется в char
. Для этого у нас есть два варианта, в зависимости от зарегистрированы ностей char
(реализаций определенных):
- без знака: Результат преобразуется в стандартном определенном способе
unsigned char
.
- подписан: результат «вниз» преобразуется в «меньший»
signed char
в определенном порядке реализации. не
Итак: ненеопределенное поведение, но (и комментарии) показывает, сколько вы должны иметь в виду при использовании знаковых целых чисел в С.
Но:
Слишком много Выполнено определенное поведение, и требуется множество предварительных условий (которые довольно общий, хотя). Лучше использовать unsigned char
и unsigned int
на протяжении всего кода. Это сделает код стандартным и совместимым.Даже для значений, отличных от CHAR_BIT
. Если вы полагаетесь на 8-битные значения, используйте uint8_t
от stdint.h
.
И ответ: возможно! – Olaf
@Olaf Никакие беззнаковые целые числа не являются частью рассматриваемого расчета. –
Если что-то это переполнение байта, так как 'str [i]' имеет тип 'char' – RPGillespie