Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从字符*到有符号字符的转换* 我看到了一段有效的C代码,我尝试编译成C++,我有一个我不能理解的错误。 char* t; signed char* v = t;_C++_Char_Signed - Fatal编程技术网

从字符*到有符号字符的转换* 我看到了一段有效的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基本类型

  • 声明为字符(char)的对象应足够大,以便存储 实现的基本字符集的任何成员。如果一个角色 从这个集合存储在一个字符对象中 该字符对象等于单个字符的值 该字符的字面形式。实现定义了 char对象可以保存负值。字符可以显式地 声明未签名或签名的普通字符、有符号字符和无符号字符 字符有三种不同的类型。字符、有符号字符和无符号字符 字符占用相同的存储量并具有相同的对齐方式 要求(3.11);也就是说,它们有相同的对象 代表性。对于字符类型,对象的所有位 表示参与值表示。未签名 字符类型,值表示的所有可能位模式 表示数字。这些要求不适用于其他类型。在里面 任何特定的实现,一个普通的char对象都可以 与有符号字符或无符号字符相同的值;哪一个是 实现定义

  • 我会说我知道的

    < > 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
    是我的最小可分配块