У меня есть программа, которая получает числа n (количество блоков) и r (объем), и после этого она получает n размеров в формате firstsize secondsize thirdsize
(например, 1 1 1
), так что общий простейший ввод: 1 1 1 1 1
который теоретически должен вернуть 1. Но это не так.
У меня есть следующий код:
#include <iostream>
#include <cstdint>
#include <vector>
using namespace std;
struct Size{
long long w=0,h=0,d=0;
};
istream& operator>>(istream& istr, Size& rval){
istr >> rval.w >> rval.h >> rval.d;
return istr;
}
long long calcMass(Size s, int r){
long long res = s.d*s.h*s.w*r;
cout << "Gained:" << res << '\n';
cout << "Got: sizes:{" << s.d << ' ' << s.h << ' ' << s.w << "}, p = " << r << '\n';
return res;
}
int main(){
int n;
long long sum = 0;
Size s;
uint8_t r; // Condition is that r<100
cin >> n >> r;
for(int i=0; i<n; i++){
cin >> s;
sum += calcMass(s,r);
}
cout << sum;
}
На самом деле , я решил эту проблему с помощьюизменив тип переменной r
в main()
с uint8_t
на int
, но проблема в том, что я не понимаю, почему она не работала, будучи uint8_t
. Когда я пробую следующий код:
cout <<'\n' << static_cast<long long>(static_cast<int>((static_cast<uint8_t>(1))));
Это дает мне 1.
Итак, я решил проверить ситуацию с uint8_t r
в main()
. uint8_t r = 1
в main()
каким-то образом становится int r = 49
в calcMass()
, и я не берусь понять почему.
Я знаю о правилах неявного преобразования, которые до операции переменные меньше по размеру, чем int
преобразуются в int
, а затем переменная "меньшего размера" преобразуется в большую (например, int r
в long long
в calcMass(Size,int)
функции?), но я не понимаю, почему: uint8_t r = 1
становится int r = 49
?
Также я попытался изменить тип r
в calcMass()
с int
на uint8_t
. Как и предполагалось, uint8_t r = 1
в main()
становится uint8_t r = 1
в calcMass()
, но результат этой функции по-прежнему 49
!
Это я использовал для запуска программы:
Operating System: Windows 10 Enterprise LTSC
System Type: 64bit
C++ compiler: MinGW
Я был бы рад, если бы кто-нибудь смог объяснить , почему явное преобразование uint8_t
в long long
isn 't равняется unlpicit при передаче его на calcMass()
и выполнении операций с long long
, используя его.