C++ 初始化向量<;char>;使用int值

C++ 初始化向量<;char>;使用int值,c++,vector,char,int,narrowing,C++,Vector,Char,Int,Narrowing,我想用以下ASCII码初始化此字符向量: vector <char> a = { 201, 187, 200, 188, 205, 186 }; char b = 201; 它很好用 所以我意识到在向量中,由于某种原因,char类型可以接收int值,直到127。从128开始,出现语法错误 这与普通变量不同,此时char类型可以接收任何int值 我尝试将向量声明为无符号字符,语法错误消失 vector <unsigned char> a = { 201, 187, 20

我想用以下ASCII码初始化此字符向量:

vector <char> a = { 201, 187, 200, 188, 205, 186 };
char b = 201;
它很好用

所以我意识到在向量中,由于某种原因,char类型可以接收int值,直到127。从128开始,出现语法错误

这与普通变量不同,此时char类型可以接收任何int值

我尝试将向量声明为无符号字符,语法错误消失

vector <unsigned char> a = { 201, 187, 200, 188, 205, 186 };
向量a={201187200188205186};
但是,

为什么字符类型向量不能接收与字符类型变量相同的int数据


我真的希望有人能给我解释一下这种行为。

没有内置的方法可以做到这一点,因为字符文字仅用单引号括起来,数字(不带后缀)是整数。您可以添加一个L、LL、UL、ULL来生成文字长、长、无符号版本,再加上一些其他的用于浮点等,但字符不存在这样的后缀

但是,如果您有C++11或更高版本的编译器,您可以编写自己的用户定义文字来帮助:

constexpr char operator "" _c(unsigned long long arg) noexcept
{
    return static_cast<char>(arg);
}

int f()
{
  std::vector <char> a = { 201_c, 187_c, 200_c, 188_c, 205_c, 186_c };
}
constexpr字符运算符“”\u c(无符号长参数)无异常
{
返回静态_cast(arg);
}
int f()
{
向量a={201_c,187_c,200_c,188_c,205_c,186_c};
}
如果这不是一个选项,或者您不喜欢它,您可以编写一个普通函数来执行类似的操作:

constexpr char c(int arg) noexcept
{
    return static_cast<char>(arg);
}

int f()
{
  std::vector <char> a = { c(201), c(187), c(200), c(188), c(205), c(186) };
}
constepr char c(int arg)noexcept
{
返回静态_cast(arg);
}
int f()
{
std::向量a={c(201),c(187),c(200),c(188),c(205),c(186)};
}

发生了两件事

1
第一个是
char
类型的默认值范围,它是实现定义的。在大多数主要编译器中,默认值为[-128127]。(奇怪的是,这与JSYK的签名字符不同。)

MSVC和GCC都提供了将
char
视为有符号或无符号的选项。您可以这样做来全局解决问题

不过,最好不要假设
char
处理范围[0127]之外的任何内容。具体使用
有符号字符
无符号字符

2
第二个是您正在使用的,它要求检查文本元素值的范围适合性

举个例子:

std::vector <char> xs = { 201, 202 };  // compiler error

char x { 201 };  // compiler error

char x = 201;  // compiler warning
std::vector xs={201202};//编译错误
char x{201};//编译错误
字符x=201;//编译器警告

如果您没有启动编译器的错误级别(您应该这样做),那么编译器将自动忽略该警告并分配该值,即使该警告在技术上无效。

如果它是常规字符,则不能超过126。它对无符号字符有效吗?那么为什么“char b=201”有效呢?它会给你一个溢出编译器错误。转到你的编译器,在你执行
char b=201
之后,你应该在下面添加,
std::cout。此外,下次编译你的代码时,一定要使用
-pedantic
标志。使用该标志将警告您您认为正常的溢出。您刚才定义了
\u c
运算符吗?Cool@smac89没有必要考虑谢谢你的回复,但是我对char类型的行为更感兴趣。为什么
charb=201
;工作,为什么
向量b={201}没有?这不是真的。可以将
int
转换为
char
,而无需新的运算符或函数(您可以编写函数)。这也不能避免转换超出范围的内容的问题;您的行为仍然是实现定义的。最后,它没有回答这个问题:它没有说为什么
char b=201
有效,但是
char b{201}
std::vector v={201}
不起作用。@WalterS.Escobedo这是因为{201},一个未加修饰的数值文本具有类型“int”。当你把它放在一个字符里,你就改变了类型。谢谢!!这真的帮了大忙。最后一个疑问。我明白,如果编译器在in不适合的情况下分配值,我将丢失数据。为什么我仍然得到我期望的角色?(ASCII code=201)在本例中,@WalterS.Escobedo编译器将环绕到
char
s范围内(这不是保证的,但几乎所有编译器都会在从
int
转换时这样做)。因此,它分配值
-55
。这与正数201的基本字节相同,当你写出它时,它会以同样的方式发送到屏幕上。谢谢Daniel H。这真的帮了大忙!。