| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2542 人关注过本帖
标题:int与unsigned相加
只看楼主 加入收藏
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
如果用别的编译器编译结果与这不一样,或者说同样的编译器在不同的机器上结果不同,只能说明这道题的结果为不确定的.
2010-06-09 12:05
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 11楼 广陵绝唱
那您肯定是用 %d 输出的,您试试 %u

我就是真命天子,顺我者生,逆我者死!
2010-06-09 12:31
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
我觉得 2 楼说的是对的, 编译器肯定是要整形提升的,不然它就不能保证运算结果的正确性

#include <stdio.h>
int main(void)
{
    char a = -20;
    unsigned int b = 10;
    unsigned int c;        
    c = a+b;             // break point

    printf("%d", a+b);

    getchar();

    return 0;
}

在第九行下个断点, 在watch 窗口里 分别 输入
a,x
b,x
c,x

我就是真命天子,顺我者生,逆我者死!
2010-06-09 12:36
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
    根据题意,并没说结果为有符号或者无符号,按照常规理解,输出为有符号,因为本题要求的是 i+j 的值.如果想求负数转换为无符号数的值,完全不必这样出题.

    另外,即使如你所说,值也会有两个.因为在 16 位或者 32 位下的 int 取值范围会不一样.

    所以,综上所述,这道题的答案就是 -10.
2010-06-09 14:30
NOMIPS
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:86
专家分:537
注 册:2010-3-31
收藏
得分:0 
heh,其实本题目的本意并不是要求出i+j的值是什么,而是
if(i+j>10)
printf(">10");
else
printf("<10");
试试~
 
2010-06-09 14:37
yao_210162
Rank: 2
等 级:等待验证会员
帖 子:33
专家分:18
注 册:2009-6-8
收藏
得分:0 
以下是引用BlueGuy在2010-6-9 12:36:39的发言:

我觉得 2 楼说的是对的, 编译器肯定是要整形提升的,不然它就不能保证运算结果的正确性

#include
int main(void)
{
    char a = -20;
    unsigned int b = 10;
    unsigned int c;        
    c = a+b;             // break point

    printf("%d", a+b);

    getchar();

    return 0;
}

在第九行下个断点, 在watch 窗口里 分别 输入
a,x
b,x
c,x
楼主的问题很好、也让我更进一步学习了、!感觉这个是回答应该是最佳的、!
2010-06-09 14:55
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1697
专家分:4310
注 册:2007-12-27
收藏
得分:0 
我们知道,二进制运算是不在乎符号的,所以如果直接输出i+j的值,无论是当作%d还是%u输出,那都是我们先入为主地对i+j的类型做出人为规定的结果,因此这样的结果不说明问题。
同样的道理,把i+j的结果赋值给另外的变量,也就默认了赋值时产生的static_cast,因此也不能这样说明问题。

所以我个人认为,这个问题有两个方式解释,
一个是纯理论的:两个变量进行运算的时候,会产生类型提升,int的会被提升为unsigned,规则如此。
另外一个参考15楼的结论,如果一个表达式的值>10了,那我们就不用认为它是负的了。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2010-06-09 17:28
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
以下是引用BlueGuy在2010-6-4 21:33:08的发言:
/*
敢问计算机能够储存东东的是什么?
*/
晕, 答非所问了,不过这问题问的真够雷人的,

//我当然知道计算机存储的是什么,计算机能够存储的是二进制数据,关键是看编译器怎么去解析数据。
//比如说一个字节FF,用unsigned char 定义的变量去存储它,它就是255, 用 signed char 定义的变量去存储它,
//就是
//-1。

说真的, 不太清楚 15楼是什么意思, 也许我的理解尚浅哦, 想多了确实挺别扭的

题外话,我经常需要把一个 int型的变量 拆成 四个字节的,然后再合成一个 int型的变量,
由这个东西引起的心灵的伤害可真不小。
readInt(signed char* input, int skip) 这样的原型是会出错的,
虽然-1与255在内存中的存储形式都为0XFF,
但是解析出来的数据对运算的结果是不一样的,

所以我都是这样处理的,
int readInt(unsigned char* input, int skip)
{
      int c, c1, c2, c3;
        /* get 4 bytes*/
        c = input[skip];
        c1 = input[skip+1];
        c2 = input[skip+2];
        c3 = input[skip+3];
        return (c3) +
                (c2<< 8) +
                (c1<< 16) +
                (c<< 24);
}

[ 本帖最后由 BlueGuy 于 2010-6-9 18:40 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-06-09 17:38
yao_210162
Rank: 2
等 级:等待验证会员
帖 子:33
专家分:18
注 册:2009-6-8
收藏
得分:0 
以下是引用forever74在2010-6-9 17:28:12的发言:

我们知道,二进制运算是不在乎符号的,所以如果直接输出i+j的值,无论是当作%d还是%u输出,那都是我们先入为主地对i+j的类型做出人为规定的结果,因此这样的结果不说明问题。
同样的道理,把i+j的结果赋值给另外的变量,也就默认了赋值时产生的static_cast,因此也不能这样说明问题。

所以我个人认为,这个问题有两个方式解释,
一个是纯理论的:两个变量进行运算的时候,会产生类型提升,int的会被提升为unsigned,规则如此。
另外一个参考15楼的结论,如果一个表达式的值>10了,那我们就不用认为它是负的了。
大虾的话让我试了一下,结果a+b的值却为正:
#include <stdio.h>

void main()
{
    int a = -20;
    unsigned int b = 10;
    printf("%d\n",a+b);    //这里显示的-10是我们通过printf按%d的格式输出的、实际上a+b的值是unsigned型的!
    if(a+b>0)
        printf(">0\n");
    else
        printf("<0\n");
}
2010-06-09 17:52
starjun14
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:266
专家分:136
注 册:2009-4-26
收藏
得分:0 
谢谢。。。学习了
2010-06-09 19:03
快速回复:int与unsigned相加
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043117 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved