有可能将多个整数赋值为一吗

Is it possible to assign multiple integers into one?

本文关键字:赋值 整数 有可能      更新时间:2023-10-16

假设我有

int a = 3; 
int b = 4; 
int c = 6;

如何做类似的事情:

int d = a,b,c;

得到d = 346;

我只需要将正确序列中的值存储在另一个整数中。

我试过了:d = a,b,c

但它表明:

Error: 'int b': redefinition and 'int c' : redefinition     

有很多方法,但不是像您尝试的那样。您可以在新的int:中将每个值分配到自己的字节中

int d = a << 16 | b << 8 | c;
std::cout << std::hex << std::setw(6) << d << std::endl; // prints 030406

或者使用半字节而不是字节:

int d = a << 8| b << 4 | c;
std::cout << std::hex << d << std::endl; // prints 346

如果你想组合单个十进制数字,你可以做:

int d = a * 100 + b * 10 + c;
std::cout << d << std::endl; // prints 346 

最后,您需要更精确地指定您希望如何组合这些值(也包括如何再次分离它们…)

您还需要指定如何处理不适合目标的值(例如a = b = c = 1 << 16;)–如果你只声明这些值是非法的;换句话说:您可以指定a、b和c的有效范围。顺便说一句:如果这些范围是非负的,请考虑使用unsigned int

编辑以回应评论

当您尝试组合日期值(天、月、年)时:将它们组合在一个结构中要容易得多:

struct Date
{
uint16_t year;   // maybe int16_t instead, if you want to represent years BC, too
uint8_t  month;
uint8_t  day;
};

提供了32位int,此结构也不会更小–16位的int无论如何都无法保存完整的日期(除非您删除一些信息)。。。

这是一个对数字执行的非常奇怪的操作,我看不出这样做的原因。如果你真的需要它,你可能应该使用字符串:

int a = 3;
int b = 4;
int c = 6;
std::string result = std::to_string(a) + std::to_string(b) + std::to_string(c);
std::cout << result << "n";

如果您需要返回数值,可以使用std::stoi()或等效值。如果数字不符合整数类型,它将抛出异常:

int d = std::stoi(result);

您可以使用std::stringstream

#include <iostream>
#include <sstream>
#include <string>
int main()
{
int a = 3; 
int b = 4; 
int c = 6;
int d;
std::stringstream str;
str<<a<<b<<c;
str>>d;
std::cout<<"d="<<d<<std::endl;
}

结果:

d=346

您缺少的概念:

对于lvalue(在您的情况下是赋值初始化的左侧)声明,您可以在一行上创建多个int变量:

int a, b, c, d;

然而,对于初始化,只有一个右值可以对应于单个int变量:

int a = 1, b, c = 5, d;

对实际问题的回答:

我真的很喜欢阿空加瓜的解决方案:(然而,在一些机器上,尤其是旧机器上,int保证是16位,而不是32位,所以我用以下方式修改了它,使其更便携)

long d = a | b << 8 | c << 16;

在这种情况下,考虑到您的long至少有32位表示,当您管道传输它们时,a使用第一个字节(8位)表示,b使用第二个字节表示,c使用第三个字节表示。这就像添加字节表示来为新的long创建新的字节表示一样。