简单的C程序输出不是预期的

时间:2014-06-11 07:19:58

标签: c

我正在做这个简单的程序而且我的思绪陷入困境

    #include<stdio.h>

    int main()
    {
        signed int a;
        signed char c;
        unsigned char b;
        b = 0xf4;
        a = (signed)b;       //    1)this assignment should be same 
        c = (signed)b;
        printf("%d\n",a);
        a = c;              //     2)as this one
        printf("%d \n",a);
        return 0; 
    }

a = 244, a = -12

我试图确保分配尽可能顺利,但我得到两个不同的答案,我希望两者都是-12。我错过了什么小事?


相关问题是

{
    b = 0xf4;
    c = 0xf4;
    a = (signed int)b;           //trying to save sign but get 244 
    printf("%d\n", a);
    a = c;                       //sign saved here and got -3 
    printf("%d", a);
}

244,-3

所以我试图从unsigned char中保存符号。这有可能吗?

4 个答案:

答案 0 :(得分:4)

    signed char c;
    unsigned char b;
    b = 0xf4;

    /* ... */

    c = (signed)b;

b的值为0xf4244),但c类型(signed char)只能保存-128和{之间的值{1}}(在您的实施中)。因此,当127分配给244时,它首先转换为c,C表示此整数转换是实现定义的。 signed char和大多数实现一样 只包围模gcc,这就是为什么256的值为c

以下是-12文档:

http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html

  

“为了转换为宽度为N的类型,该值以2 ^ N的模数减少到”

的范围内

答案 1 :(得分:1)

问题出在这里:

c = (signed)b;

将b,244的值转换为带符号的char会导致整数溢出,从而导致您看到的值为-12。将c的类型更改为signed int可以解决问题。

答案 2 :(得分:1)

据我了解,244的输出是正确的。首先,b被初始化为值244,表示为十六进制文字,然后转换为signed int a,其可以保存244的值。根据{{​​3}}的规范,244的输出是预期的。

答案 3 :(得分:0)

如果您没有进行类型转换&#39; b&#39;通过签名,您将获得相同的结果。

在第一次作业中

a =(签名)b;

你正在加载一个带有0xf4的有符号整数(16位/ 32位/ 64位),它可以容纳,并且msb是&#39; 0&#39;结果将是244。

如果您的int长度为8位,那么结果将是&#39; -12&#39;。

在第二种情况下,你必须得到&#39; -12&#39;因为2&#39; -12&#39;的补充是0xf4。