Wal*_*edo 3 c++ int vector char narrowing
我想用这个ASCII码初始化这个char向量:
vector <char> a = { 201, 187, 200, 188, 205, 186 };
Run Code Online (Sandbox Code Playgroud)
我在所有6个字符中都会出现此语法错误:
从"int"到"char"的缩小转换无效:常量值不适合目标类型
但是当我使用相同的ASCII代码初始化单个char变量时:
char b = 201;
Run Code Online (Sandbox Code Playgroud)
它工作正常.
所以我意识到在向量中,由于某种原因,char类型可以接收int值直到127.从128开始出现语法错误.
这与普通变量不同,当char类型可以接收任何int值时.
我尝试将向量声明为unsigned char,语法错误消失.
vector <unsigned char> a = { 201, 187, 200, 188, 205, 186 };
Run Code Online (Sandbox Code Playgroud)
但是,
为什么char类型向量不能接收与char类型变量相同的int数据?
我真的很感激有人向我解释这种行为.
有两件事情在发生.
1
第一个是类型的默认值范围char,它是实现定义的.在大多数主要编译器中,默认值为[-128,127].(奇怪的是,这与JSYK 不一样signed char!)
MSVC和GCC都提供了char作为签名或未签名处理的选项.您可以这样做以全局解决问题.
但更好的是,不要假设char处理范围之外的任何东西[0,127].使用signed char或unsigned char具体.
2
第二个是您正在使用大括号初始化,这需要检查文字元素值的范围拟合.
对于你的例子:
std::vector <char> xs = { 201, 202 }; // compiler error
char x { 201 }; // compiler error
char x = 201; // compiler warning
Run Code Online (Sandbox Code Playgroud)
如果你没有编译器的错误级别(你应该),那么编译器将默默地忽略该警告并分配值,即使它在技术上是无效的.
| 归档时间: |
|
| 查看次数: |
2913 次 |
| 最近记录: |