Я пытаюсь использовать C++ для вычисления числа, но получаю неправильный ответ. Я думаю, это может быть связано с типом данных?
Я пытался преобразовать все числа в беззнаковые задолго до умножения, но результат тот же.
#include <iostream>
using namespace std;
int main()
{
unsigned int width = 8864;
unsigned int height = 5288;
unsigned int NImg = 50;
unsigned long TotalBytes;
TotalBytes = (width * height * NImg + 2 ) * 2;
cout<<TotalBytes<<endl;
}
TotalBytes должен рассчитываться как 4687283204, но код С++ дает мне 392315908.
Спасибо большое
Также можно использовать типы фиксированной ширины из cstdint, чтобы явно указать на это.
Когда вы работаете с C++ и сталкиваетесь с подобными «проблемами», имеет смысл указать, какую ОС и компилятор вы используете. Поскольку разные реализации имеют разные максимальные размеры для разных типов. Единственное, что упоминается в стандарте, — это минимальный размер, который должен соответствовать данному типу.
Стандарт C++ не гарантирует, что unsigned long будет поддерживать значение больше 4294967295, которое меньше значения, которое вы пытаетесь вычислить. Если вы хотите большее значение, используйте unsigned long long. Имейте в виду, что unsigned long long также не безгранично — максимальное представимое значение больше, чем представленное unsigned long, но все же конечно.





На вашей платформе unsigned long тоже 32 бита, как и unsigned int. Этого недостаточно, чтобы сохранить результат вычисления. Вам придется использовать unsigned long long, или, если хотите, вы можете использовать uint64_t:
#include <iostream>
#include <cstdint>
using namespace std;
int main()
{
uint64_t width = 8864;
uint64_t height = 5288;
uint64_t NImg = 50;
uint64_t TotalBytes;
TotalBytes = (width * height * NImg + 2 ) * 2;
cout<<TotalBytes<<endl;
}
Проголосовал за упоминание uint64_t. Эти псевдонимы типов следует использовать, если требуется определенная разрядность.
Это действительно должно быть uint_least64_t (или, возможно, uint_fast64_t), которое всегда будет достаточно большим, чтобы вместить результат. В конце концов, целью здесь является нет, чтобы иметь определенный размер, но иметь размер, равный достаточно большой. Кроме того, uint_least64_t должен существовать на всех соответствующих платформах, а uint64_t — нет. Конечно, ситуации, когда uint64_t не существует, будут довольно редкими, но нет ничего плохого в том, чтобы избежать этой (редкой) проблемы.
Попробуйте использовать Big Integer. Вы можете создать класс или использовать чью-то библиотеку для его реализации. Например, http://www.cplusplus.com/forum/general/108176/
Перебор. 64-битного int достаточно.
Судя по всему,
unsigned longна вашей платформе 32-битный. Попробуйтеunsigned long long, он должен соответствовать вашим результатам.