为什么C++不接受字符数组的有符号或无符号字符
Why doesn't C++ accept signed or unsigned char for arrays of characters
>我在Visual Studio 2017的本机模式下使用C++。 该编译器毫无怨言地编译了以下语句:
const char * AnArrayOfStrings[] = {"z1y2x3w4", "Aname"};
但是,如果我更改上述语句以指定 char 是有符号的还是无符号的,编译器会发出C2440错误。 例如,下面的语句不编译:
const signed char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};
const unsigned char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};
我看不出编译器在明确字符符号时拒绝编译语句的原因。
我的问题是:是否有充分的理由让我看不到编译器拒绝编译这些语句?
感谢您的帮助(我在StackOverflow中做了研究,C++文档,我使用Google并查阅了大约十几本C/C++书籍,试图自己找到答案,但是,一个原因仍然让我无法找到答案。
>"z1y2x3w4"
const char[9]
,并且没有从const char*
到const signed char*
的隐式转换。
您可以使用reinterpret_cast
const signed char * AnArrayOfStrings[] = {reinterpret_cast<const signed char *>("z1y2x3w4"),
reinterpret_cast<const signed char *>("Aname")};
如果你编译上面的代码
const signed char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};
在 C 中使用 gcc 使用选项-Wall
然后它会给出以下警告
test.c:5:49: warning: pointer targets in initialization differ in signedness [-Wpointer-sign]
const unsigned char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};
^
test.c:5:49: note: (near initialization for 'AnArrayOfStrings2[0]')
test.c:5:61: warning: pointer targets in initialization differ in signedness [-Wpointer-sign]
const unsigned char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};
AnArrayOfStrings2
和"z1y2x3w4"
元素的类型不同。AnArrayOfStrings2[0]
属于const signed char *
型,而"z1y2x3w4"
属于const char[9]
型。
相同的代码将在C++中引发错误。您将需要显式强制转换才能使其在C++中工作。
解释原因
const char * AnArrayOfStrings[] = {"z1y2x3w4", "Aname"};
作品我会举一个简单的例子
const char c[] = "asc";
const char *p1 = c; // OK
signed const char *p2 = c; // Error
unsigned const char *p3 = c; // Error
在上述代码片段的第二行中,c
将转换为const char *
从而使p1
和c
兼容的类型。
在第三行中,p2
和c
的类型不兼容,编译器将在C++中引发错误(C 中的警告)。第 4 行也会发生同样的情况。
如果我们再举一个例子int
类型
const int i[] = {1,2,3};
const int *ii = i // OK
signed const int *si = i; // OK
unsigned const int *usi = i; // Error
前两个指针初始化工作int
没有任何说明符等效于signed int
(但对于char
不是这样),因此类型是兼容的。初始化在最后一种情况下失败,因为const int *
或signed const int *
与unsigned const int *
不兼容。
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 将超出范围的整数分配给有符号字符类型
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 库特无符号字符
- 寻找一种更好的方法来表示无符号字符数组
- C++ 无符号字符 *{varName};-> C#
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何将字符符号作为动作数学的字符
- 我能把字符符号转换成字符串吗