从uint8_t到int的隐式转换出错了,当显式转换顺利时

问题描述 投票:0回答:1

我有一个程序,该程序获取数字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;

}

Actually,通过将rmain()变量的类型从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

而且,我尝试将rcalcMass()的类型从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_tlong long的显式转换不等于在将它传递给calcMass()并使用long long进行操作时不隐含的转换,我会很高兴。

c++ type-conversion long-integer implicit-conversion uint8t
1个回答
0
投票

详细说明comment of S.M.

49是ASCII码'1'。因此,请朝无符号字符的方向看一下,以了解为什么会得到49。

std::stream运算符对charsigned charunsigned char的操作与其他整数类型略有不同。

用于输入和输出。

[std::cout << (int)49;打印49,但是std::cout << (char)49;打印1

[std::uint8_t很可能是typedef unsigned char uint8_t;

示例:

#include <iostream>
#include <sstream>
#include <cstdint>

int main()
{
  std::cout << "(int)49: " << (int)49 << "\n";
  std::cout << "(char)49: " << (char)49 << "\n";
  std::cout << "(std::uint8_t)49: " << (std::uint8_t)49 << "\n";
  int i; char c; std::uint8_t u8;
  std::istringstream in("49\n1\n1");
  in >> i >> c >> u8;
  std::cout << "i: " << i << '\n';
  std::cout << "(int)c: " << (int)c << '\n';
  std::cout << "(int)u8: " << (int)u8 << '\n';
}

输出:

(int)49: 49
(char)49: 1
(std::uint8_t)49: 1
i: 49
(int)c: 49
(int)u8: 49

Live Demo on coliru

© www.soinside.com 2019 - 2024. All rights reserved.