从char *转换为signed char *

时间:2013-10-18 08:04:52

标签: c++ char signed

我看到了一段有效的C代码,我尝试编译为C ++,我收到了一个我无法理解的错误。

char* t;
signed char* v = t;
  

错误:从char*signed char*

的转换无效

根据我的学习,charsigned char在语义上是相同的,但编译器仍认为它们不同。

我知道错误是由这两种类型之间的差异引起的,我的问题是:为什么存在这种差异?

据我所知,char以[{1}}或signed char的形式实现,因此它应该与其中一个相同。


我咨询过this question,并没有回答我想知道的问题。

3 个答案:

答案 0 :(得分:10)

实际上我终于找到了规范部分谈论这个:

  

3.9.1基本类型

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

答案 1 :(得分:0)

  

根据我的学习,charsigned char在语义上是相同的,但编译器仍然认为它们是不同的。

NO。 char在语义上与signed char不相同。

与其他整数类型(整数,长整数,短整数等)相比,不能保证没有signedunsigned的字符将是signed。这是实现定义的。有些架构将其定义为signed,其他架构在现实世界中将其定义为unsigned

因此,使用char,如果签名很重要,您确实需要指定所需的内容。

我的建议是,如果你正在进行角色操纵等,或使用使用charchar *的api调用,请使用char。如果您只想要一个8位整数值,请确保指定signed charunsigned char,以便在几年内移植到不同的架构时,您不会被叮咬烧伤。

或者更好的是,使用uint8_tint8_t获取8位整数。

编辑:从你自己的回答:

  

这些要求不适用于其他类型。在任何特定的实现中,普通的 char对象可以采用与signed char 相同的值或的unsigned char; 哪一个是实现定义的。

答案 2 :(得分:-1)

我会说出我所知道的......

对于char类型,c ++的大小为'1'字节..

如果是signed char,则范围是-128到127 否则,如果它是unsigned char范围是从0到256

我们都知道在有符号字符的情况下字节中的8位MSB(即最左边的位)将用于符号,其余7位用于值范围0-2 ^ 7(0-127) )。在MSB上为正号的负号(逻辑1)和(逻辑0)。例如(1 0000111 = -7,0 0000111 = + 7)和1 0000000-128。但是,如果为已签名的char值分配129,它将自动更改为-127(即范围内的值(-128,127)。

在另一种无符号字符类型的情况下,所有8位都用于值,即范围是0-2 ^ 8(0-255)。这里0-127与signed char相同,并且在无符号字符集中可以在128-255范围内找到属于-128到0的那些。

所以我们可以说并发现两种类型'签名'和'无符号'之间的内部记忆差异,这可能是问题所在。