当前位置:  技术问答>linux和unix

类型转换的问题

    来源: 互联网  发布时间:2016-12-28

    本文导语:  #include  int main(int argc, char *argv[]) {         long n1, n2;         long r;         unsigned short s1, s2;         s1 = 100;         s2 = 10;         n1 = 0;         n2 = 1;         r = 1000 * (n2 - ...


#include 

int
main(int argc, char *argv[])
{
        long n1, n2;
        long r;
        unsigned short s1, s2;

        s1 = 100;
        s2 = 10;

        n1 = 0;
        n2 = 1;

        r = 1000 * (n2 - n1) + (s2 - s1);

        printf("%ldn", r);

        return 0;
}

正常应该输出910
为什么在AIX下,用xlc编译,输出结果是4294968206

是不是xlc的bug?或者是未定义行为?

|
按照xlc的结果,s2 - s1他给转成了unsigned long,再和1000 * (n2 - n1)相加……

正常的“短类型转长类型”的规则,不同类型相加会按照长类型取值

所以,现在的关键就是1000 * (n2 - n1)的结果,编译器把他认成什么类型,xlc认成unsigned long,VC认成long

这个还真不好说是bug……

|
(s2 - s1)

一般的编译器都是把中间计算结果转化为int形,上面的中间结果就是-10.

但是这个编译器是按照参与计算的s2、s1,转化为unsigned shot形。


所以,中间计算加强制转化最安全。

r = (int)(1000 * (int)(n2 - n1)) + (int)(s2 - s1)

|
 学习了!

|

有道理,可能是编译器的原因

|

有道理,编译器中间进行了类型转换导致

|
类型的byte存储结构和方式取决于compiler

|
应该是类型转换导致的.
这种情况反汇编看看会比较清楚.

|
unsigned short转换为long的过程中出问题了

|
学习学习,没用过xlc。。

|
我觉得不是参数转换问题,而是执行顺序问题,你用括号将s2 - s1括起来,那么他就会先计算s2 -s1,得到一个极大的数,然后再将这个极大的数进行数据类型转换,自然就得到一个极大地值。
你如果把括号去了,应该就不会这样了。

|
无符号的unsinged short 想减变成一个大数

|
 unsigned short s1, s2;
估计是这里的问题。你这两个是无符号类型的,它就比其他的类型少了一半。比如int的范围[-32767-32767]。你可以做个测试啊,把unsigned short改成与其他类型一致的long,这样就可以试一下了

|
无符号整数运算出负数也没啥,二进制还是-90的.

问题主要在于Long和unsigned short运算时,到底是无符号转有符号还是有符号转无符号.


|
learn

|


好像C语言标准并没用规定中间值是无符号还是有符号。这个好像是编译器的事情,但是绝大多数编译器都会按照有符号处理。

我以前遇到过这样的问题,char形的变量在有的编译器认为是有符号的,有的是无符号的。

这样的结果会导致这样的问题:
char ch = 0x80;
int x = ch;

有的编译器会认为x是正数(0x80),有的编译器会把x认为是个负数。

所以,变量之间的赋值强制转换还是非常必要的。---大部分情况下,没人会处理这些warning的。

    
 
 

您可能感兴趣的文章:

  • Python3中内置类型bytes和str用法及byte和string之间各种编码转换
  • 请问能否把任何类型数据转换为一种类型,然后从这种类型又转换回去?例如:int>>Object Object>>int
  • 标准c++四种强制类型转换方式介绍
  • 如何实现float 到 int 的类型转换,string 到 int 的类型转换?
  • void *类型与其他指针类型的相互转换?
  • 如何将String类型转换成Blob类型
  • 怎样将字符串类型转换成double类型?
  • (在线等)无符号int类型如何向ip类型进行转换呢
  • String类型数据与Date类型转换的问题?
  • 如何将java.util.Date类型的日期转换成java.sql.Date类型的日期?
  • 如何将Srting类型的字符窜转换成byte[]类型的数组呢?
  • 怎样把一个int类型(不是Integer)转换才String类型?
  • C语言中自动隐式转换与类型强制转换实例分析
  • 哪位大哥大姐知道结果集中的日期类数据在输出显示时应转换为什么类型的数据,怎么转换?
  • java中的字符类型如何转换成String类型
  • 怎么样把基本数据类型转换为引用类型啊?唉,菜鸟
  • QString 类型如何转换到char *类型?
  • 小问题:如何将一个字符串类型(比如“2001-6-26”)转换为一个日期类型?立即给分。
  • 如何从Vector中提取任意类型的对象(是否涉及强制类型转换)?
  • 因为mmap函数返回值是void*类型,是否可以将其强制转换成char*类型,按字符串操作,然后将修改重新写入内存映像即可????
  • 怎么将一个字符串类型转换为整型,比如说将“123”转换为123
  • 错误:将'const x'作为'x'的'this'实参时丢弃了类型限定问题解决
  • 求救:关于将类型名称字符串转变成类型相应类型的问题
  • spring的事务类型及spring和hibernate可能导致的问题分析
  • char 类型如何与16进制类型比较的问题,紧急
  • 请教JAVA小问题:如何将含数字的String类型的对象转化为int或long类型
  • docker中文入门学习手册 iis7站长之家
  • 谁能告诉我,LONG类型怎么转化成DATE类型输出显示啊,困扰我好久的问题了!
  • 求教:Vector类型与String类型间的转换问题
  • 关于时间类型向字符串以及字符串向时间类型的转换问题? 很急
  • corba枚举类型参数传递问题?(大笨鸟问题)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.xml.ws注释类型webserviceref成员方法: type定义参考
  • java 基本类型或可序列化类型,这里说的可序列化类型是什么意思???具体都有哪些类型??谢谢
  • java命名空间javax.annotation注释类型resource的类成员方法: authenticationtype定义及介绍
  • c# 所有类型都从Object类型派生
  • java命名空间javax.annotation注释类型resource的类成员方法: type定义及介绍
  • c# 引用类型和值类型
  • java命名空间javax.xml.ws注释类型webserviceref成员方法: value定义参考
  • C#枚举类型与结构类型实例解析
  • java命名空间javax.annotation注释类型resource的类成员方法: shareable定义及介绍
  • oracle中的空类型与c语言的空类型相匹配吗?
  • java命名空间javax.jws注释类型webparam的类成员方法: mode定义及介绍
  • linux修改所有文件类型为文本类型
  • java命名空间javax.xml.ws注释类型webserviceref成员方法: wsdllocation定义参考
  • 请问在jbuilder中如何将String类型的字符串赋值给StringBuffer类型的变量?
  • java命名空间javax.xml.bind.annotation注释类型xmlelementref的类成员方法: type定义及介绍
  • Access 数据类型与 MS SQL 数据类型的相应
  • java命名空间javax.xml.bind.annotation注释类型xmlenum的类成员方法: value定义及介绍
  • 请教将字符类型转化为整数类型的函数,多谢!
  • java命名空间javax.xml.ws注释类型responsewrapper成员方法: targetnamespace定义参考
  • 如何把int类型的转化成String类型的
  • java命名空间javax.xml.ws注释类型responsewrapper成员方法: classname定义参考
  • 如何把string类型的转化成int类型的?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3