Я написал этот фрагмент кода, чтобы увидеть, что произойдет, если я положил отрицательное целое число в целочисленный массив без знака.Как получается, что целочисленный массив без знака может содержать отрицательное целое число?
#include <iostream>
int main()
{
using namespace std;
unsigned int array[4];
array[0]=4;
array[1]=4;
array[2]=2;
array[3]=-2;
cout << array[0] + array[1] + array[2] + array[3] << endl;
unsigned int b;
b=-2;
cout << b <<endl;
return 0;
}
Я ожидал, что в обоих случаях произойдет переполнение целых чисел. Однако только во втором случае это действительно произошло. В первом случае все велось так, как если бы это был массив целочисленных чисел, а не целочисленный массив без знака. Так что же происходит, что вызывает это аномальное поведение. Мой компилятор gcc 4.8 в случаях, имеющих какое-либо значение. Спасибо за помощь. EDIT: Вот-й выход на моем компьютере
8
4294967294
Каков ожидаемый результат и каков фактический результат? –
Целое переполнение *. * Происходит. Просто случается так, что вы довольны. Это не гарантирует работу, это просто обычное дело. –
На самом деле, я уверен, что неподписанные правила переполнения и подписания -> без знака определены таким образом, что первый результат гарантированно равен 8, а второй результат гарантированно будет на 1 меньше максимального unsigned int. Это * подписан * переполнение, которое делает сумасшедшее дерьмо. – user2357112