从字符*到有符号字符的转换* 我看到了一段有效的C代码,我尝试编译成C++,我有一个我不能理解的错误。 char* t; signed char* v = t;
错误:从从字符*到有符号字符的转换* 我看到了一段有效的C代码,我尝试编译成C++,我有一个我不能理解的错误。 char* t; signed char* v = t;,c++,char,signed,C++,Char,Signed,错误:从char*到signed char*的转换无效 据我所知,char和signed char在语义上是相同的,但编译器仍然认为它们是不同的 我知道错误是由这两种类型之间的差异造成的,我的问题是:为什么会存在这种差异? 据我所知,char实现为signed char或unsigned char,因此它应该与其中一个相同 我咨询过,但它没有回答我想知道的问题。事实上,我最终发现规范部分谈到了这一点: 3.9.1基本类型 声明为字符(char)的对象应足够大,以便存储 实现的基本字符集的任何成
char*
到signed char*
的转换无效
据我所知,char
和signed char
在语义上是相同的,但编译器仍然认为它们是不同的
我知道错误是由这两种类型之间的差异造成的,我的问题是:为什么会存在这种差异?
据我所知,char
实现为signed char
或unsigned char
,因此它应该与其中一个相同
我咨询过,但它没有回答我想知道的问题。事实上,我最终发现规范部分谈到了这一点: 3.9.1基本类型
我会说我知道的 < > Car类型C++具有大小“1”字节… 如果是有符号字符,则范围为-128到127 否则,如果是无符号字符,则范围为0到256 我们都知道,对于有符号字符,字节中的8位MSB(即最左边的位)将用于符号,其余7位用于范围为0-2^7(0-127)的值。负号(逻辑1)和(逻辑0)用于MSB上的正号。例如(1 0000111=-7,0 0000111=+7)和1 0000000-128。但是,如果为有符号字符值分配129,它将自动更改为-127(即范围(-128127)内的值) 在无符号字符类型的另一种情况下,所有8位用于值,即范围为0-2^8(0-255)。此处0-127与有符号字符相同,属于-128到0的字符可在无符号字符集中的128-255范围内找到 因此,我们可以说并发现两种类型“有符号”和“无符号”之间的内存差异,这可能是问题所在 据我所知,
char
和signed char
在语义上是相同的,但编译器仍然认为它们是不同的
否。char
在语义上与signed char
不同
与其他整数类型(整型、长型、短型等)相比,不能保证没有有符号
或无符号
的字符将有符号
。这是实现定义的。一些体系结构将其定义为有符号
,而在现实世界中,其他体系结构将其定义为无符号
因此,对于char
,如果签名很重要,那么确实需要指定所需的签名
我的建议是,如果您正在执行字符处理等操作,或者使用使用char
或char*
的api调用,请使用char
。如果您只需要一个8位整数值,请确保指定有符号char
或无符号char
,以便在几年后,当您移植到不同的你不会被屁股咬的
或者更好的方法是,对8位整数使用uint8\u t
或int8\u t
编辑:根据您自己的答案:
这些要求不适用于其他类型。在任何特定的实现中,普通字符对象可以采用与有符号字符相同的值或无符号字符;哪一个是实现定义的。
我喜欢将
signed
和unsigned char
视为算术类型,本质上只是小整数,而char
是I/O类型--命令行参数、环境和通过文件的读/写都是用char来完成的。这个问题已经在中得到了回答--最基本的解释是unsign有符号字符的范围为0..255,有符号字符的范围为-127..128。因此,您不能将-42的有符号字符转换为无符号字符
,也不能将142的无符号字符
转换为有符号字符
通常被解读为有符号字符
@alle_meije和有符号字符
和char
是相等的。虽然我搜索了它,但我没有看到这个问题…我不是这样读的它是由实现定义的,一个char对象是否可以包含负值。
@alle_meije我的意思是,它要么等于有符号字符
要么等于无符号字符
,这取决于实现但是正如答案所说,规范要求类型不同,而不是类型本身的差异。@Geoffroy希望这有帮助!谢谢你的回答,这都是真的,但不是实际问题:)@Raon:实际上标准上说:sizeof(char)==1
但没有确定1=>1字节,只是确定char
是我的最小可分配块