V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

我,我,我,我的电脑超神啦?

  •  
  •   Newyorkcity · 2017-02-03 20:29:31 +08:00 · 3270 次点击
    这是一个创建于 2842 天前的主题,其中的信息可能已经有所发展或是发生改变。


    我的电脑的字长 4128 字节?? 这可咋整啊

    第 1 条附言  ·  2017-02-03 23:06:55 +08:00
    还有个问题
    int main(){
    char c = 127;
    printf("c+1=%d\n",c+1);
    printf("c+(char)1=%d\n",c+(char)1) ;
    c = c + char(1);
    printf("经过 c = c + char(1)之后, c=%d\n",c);

    return 0;
    }
    输出结果:
    c+1=128
    c+(char)1=128
    经过 c = c + char(1)之后, c=-128
    Q :为什么单独在外赋值和在 printf()内部改变会有差距(即使经过了强制类型转换)?
    20 条回复    2017-02-04 10:27:06 +08:00
    a87150
        1
    a87150  
       2017-02-03 20:34:20 +08:00
    \n
    huluhulu
        2
    huluhulu  
       2017-02-03 20:36:32 +08:00
    \n
    huluhulu
        3
    huluhulu  
       2017-02-03 20:37:03 +08:00
    c4 还被吃掉了呢
    lalalakakaka
        4
    lalalakakaka  
       2017-02-03 20:40:21 +08:00
    2333
    zbinlin
        5
    zbinlin  
       2017-02-03 20:44:05 +08:00
    第 1 与第 2 个 printf 没换行
    Newyorkcity
        6
    Newyorkcity  
    OP
       2017-02-03 20:45:40 +08:00
    自惭形秽,没脸见人了。
    Newyorkcity
        7
    Newyorkcity  
    OP
       2017-02-03 20:48:34 +08:00
    @a87150
    @huluhulu
    @lalalakakaka
    @zbinlin
    再请问一下
    为何 c1+1 的输出是 128 ,不应该是-128 么?
    同样 c2-1 的输出不应该是 127 么。。
    c3+1 不应该溢出所以变为 0 了么。。
    RE
        8
    RE  
       2017-02-03 21:16:00 +08:00
    @Newyorkcity c1 = 127 ,为何 127 + 1 会等于 -128 ???
    Newyorkcity
        9
    Newyorkcity  
    OP
       2017-02-03 21:19:56 +08:00
    @RE char 在内存只占用一个字节即 8 个比特,所以 127 的存储是 01111111 ,加一之后变为 10000000 ,再没有声明 unsined 的情况下不应该把它当做-128 的补码,输出-128 么?
    linfx7
        10
    linfx7  
       2017-02-03 21:32:50 +08:00 via iPhone   ❤️ 1
    @Newyorkcity 是因为%d 吧
    zbinlin
        11
    zbinlin  
       2017-02-03 21:35:20 +08:00
    @Newyorkcity 你又不是使用 `c1 += 1`,在 c1 上赋值
    azh7138m
        12
    azh7138m  
       2017-02-03 22:11:21 +08:00 via Android   ❤️ 1
    @RE 简略点就算是 char+int ,结果是按 int 来
    azh7138m
        13
    azh7138m  
       2017-02-03 22:12:17 +08:00 via Android
    @azh7138m 回复错了。。。尴尬
    lris1930170407
        14
    lris1930170407  
       2017-02-03 22:16:35 +08:00
    仿佛回到了大一学 C 语言的计算机教室里面
    huluhulu
        15
    huluhulu  
       2017-02-03 22:49:56 +08:00
    @Newyorkcity 参考 整型提升
    Newyorkcity
        16
    Newyorkcity  
    OP
       2017-02-03 23:03:56 +08:00
    @azh7138m 应该不是,我试着强制转换类型后还是输出 128
    int main(){
    char c = 127;
    printf("c+1=%d\n",c+1);
    printf("c+(char)1=%d\n",c+(char)1) ;
    c = c + char(1);
    printf("经过 c = c + char(1)之后, c=%d\n",c);

    return 0;
    }
    输出结果:
    c+1=128
    c+(char)1=128
    经过 c = c + char(1)之后, c=-128
    @zbinlin wow ,可是为什么在 print 中赋值和在外面单独赋值会有这么大的差别呢?
    davy1995
        17
    davy1995  
       2017-02-04 01:00:51 +08:00 via Android
    @Newyorkcity 前两个哪里是赋值语句?
    davy1995
        18
    davy1995  
       2017-02-04 01:09:54 +08:00 via Android
    @Newyorkcity 前两个又没有重新赋值给一个 char 类型变量
    scnace
        19
    scnace  
       2017-02-04 09:01:54 +08:00 via Android
    去看下 printf 的原型函数呗~
    Newyorkcity
        20
    Newyorkcity  
    OP
       2017-02-04 10:27:06 +08:00
    @davy1995 即便 printf 函数内的那种不算赋值,为什么传 127+char(1)给%d 和传 char c = 128 给%d 的结果不同呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2658 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:08 · PVG 19:08 · LAX 03:08 · JFK 06:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.