首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型转换对于不同的编译器给出不同的结果。

类型转换对于不同的编译器给出不同的结果。
EN

Stack Overflow用户
提问于 2014-05-19 04:40:31
回答 3查看 185关注 0票数 2

这只是一个基本的东西,但仍然与此混淆。

我的代码由一行组成

代码语言:javascript
复制
signed char var = 0x80;
unsigned short temp_val;
temp_val = (unsigned short)var ;

当我使用XC32编译器编译这段代码并执行该程序时,得到的结果与预期的0xFF80相同。

但是在使用CCS编译器进行MSP430编译时,得到的结果是0x0080

为什么在编译器方面存在这种差异?

有人能从处理器的角度解释一下这种类型铸造吗?

EN

回答 3

Stack Overflow用户

发布于 2014-05-19 05:28:28

这是有符号整数溢出,因为0x80 = 128,如果CHAR_BIT是8,那么signed char只会上升到127。

代码语言:javascript
复制
signed char var = 0x80;

有符号整数溢出会产生未定义的行为。

尝试使用signed char var = -128代替。

如果这会产生相同的结果,那就是编译器的错误。将负数转换为unsigned类型将其从对应的模数中减去,该模数大于该类型的最大值。

票数 1
EN

Stack Overflow用户

发布于 2014-05-19 04:44:53

如果char的位数超过8位,这种情况就会发生,这当然是允许的。(不能再少了。)如果short结果只有8位,这不符合标准C,但CCS编译器只声称符合"97%“,也会发生这种情况。

各种整数数据类型的大小受处理器的限制,但最终由编译器定义,编译器甚至可能有更改大小的选项。

我对MSP430一无所知,但谷歌告诉我这是一个16位芯片。它的内存可能不是字节可寻址的,在这种情况下,char必须占用整个16位。(编辑:很明显,它是字节可寻址的,所以不要理会这个理论。)

票数 0
EN

Stack Overflow用户

发布于 2014-05-19 05:05:55

任何字符都可以是,到编译器,不同的长度取决于编译器的设置,包括7位(现在很少),8位(大多数人认为是这样),16位(特别是在Unicode中变得更常见),我甚至遇到了机器/编译器组合,将每个字符存储在64位位置。

编译器之间的这种差异就是为什么MISRA C有反对以下内容的规则:

  • 基型
  • 符号类型上的位操作

仅仅因为芯片是字节可寻址的,这并不意味着任何给定的编译器都会这样使用,默认情况下是,因为16或更大的存储系统上的字节操作可能会导致处理开销,一些编译器默认使用内存大小操作来优化速度而不是存储。

我建议搜索pack的编译器文档。

几年前,默认的Solaris编译器对位字段中的每个字段使用了64位位置--幸运的是,Solaris gcc没有这样做,所以我们能够完成这个项目。

同样有趣的是:

代码语言:javascript
复制
signed char var = 0x80;
signed short temp_val1;
unsigned short temp_val2;

temp_val1 = (signed short)var ;
temp_val2 = (unsigned short)temp_val1;

这可能会突出显示编译器中符号扩展的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23729819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档