我看到了一段有效的C代码,我尝试编译为C ++,我收到了一个我无法理解的错误。
char* t;
signed char* v = t;
错误:从
的转换无效char*
到signed char*
根据我的学习,char
和signed char
在语义上是相同的,但编译器仍认为它们不同。
我知道错误是由这两种类型之间的差异引起的,我的问题是:为什么存在这种差异?
据我所知,char
以[{1}}或signed char
的形式实现,因此它应该与其中一个相同。
我咨询过this question,并没有回答我想知道的问题。
答案 0 :(得分:10)
实际上我终于找到了规范部分谈论这个:
3.9.1基本类型
- 声明为字符(char)的对象应足够大以存储 实现的基本字符集的任何成员。如果是一个角色 从这个集合中存储一个字符对象的积分值 该角色对象等于单个字符的值 字符的字面形式。它是实现定义的 char对象可以保存负值。字符可以是明确的 声明未签名或签名。 普通字符,签名字符和未签名字符 char是三种不同的类型。一个char,一个带签名的char和一个unsigned char占用相同的存储量并具有相同的对齐方式 要求(3.11);也就是说,它们具有相同的对象 表示。对于字符类型,对象的所有位 代表参与价值表示。对于未签名 字符类型,值表示的所有可能的位模式 代表数字。这些要求不适用于其他类型。在 任何特定的实现,一个普通的char对象都可以采取 与signed char或unsigned char相同的值;哪一个是 实现定义的。
醇>
答案 1 :(得分:0)
根据我的学习,
char
和signed char
在语义上是相同的,但编译器仍然认为它们是不同的。
NO。 char
在语义上与signed char
不相同。
与其他整数类型(整数,长整数,短整数等)相比,不能保证没有signed
或unsigned
的字符将是signed
。这是实现定义的。有些架构将其定义为signed
,其他架构在现实世界中将其定义为unsigned
因此,使用char
,如果签名很重要,您确实需要指定所需的内容。
我的建议是,如果你正在进行角色操纵等,或使用使用char
或char *
的api调用,请使用char
。如果您只想要一个8位整数值,请确保指定signed char
或unsigned char
,以便在几年内移植到不同的架构时,您不会被叮咬烧伤。
或者更好的是,使用uint8_t
或int8_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的那些。
所以我们可以说并发现两种类型'签名'和'无符号'之间的内部记忆差异,这可能是问题所在。