Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用钻头工作。溢流_C_Bits - Fatal编程技术网

C 用钻头工作。溢流

C 用钻头工作。溢流,c,bits,C,Bits,为什么我会得到结果a=-126和b=255 x1是1000 0001 x2是0000 0001 总和=1000 0010,因此是130。但是,因为char是这种情况,130超过了8位128上表示的最大可能值。 在这种情况下我能做什么?谢谢 简单地说,x1+x2等于1000 0010 当结果存储到有符号整数中时,符号被扩展, 因此,a是1111111100010,这是两种恭维格式中的126D。几乎所有的计算机都以2的恭维格式存储负数。 因此,a被解释为-126。 现在b=1111111100010

为什么我会得到结果a=-126和b=255

x1是1000 0001

x2是0000 0001

总和=1000 0010,因此是130。但是,因为char是这种情况,130超过了8位128上表示的最大可能值。 在这种情况下我能做什么?谢谢

简单地说,x1+x2等于1000 0010 当结果存储到有符号整数中时,符号被扩展, 因此,a是1111111100010,这是两种恭维格式中的126D。几乎所有的计算机都以2的恭维格式存储负数。 因此,a被解释为-126。 现在b=1111111100010>>8&0000 0000 1111111111111 因此,b=0000 0000 1111111 1111=255D。 假设:

编译器将整数视为32位

负数以2的恭维形式表示


尽管您使用0x81初始化带符号的char变量,但其值取决于其数据类型。模式0x81表示-127

当你把-127和1相加,得到的是-126的和。1000 0010


结果将使整数升级到结果类型signed int过期。在此阶段,符号将扩展到新的数据类型。1111 1111 1000 0010. 高位是您在b中看到的值。

在C中,默认情况下,char声明是有符号的char-127到+127。如果要增加范围,则必须将其设为无符号字符0到+255

所以下面的代码片段适合您

int main(void)
    {
        char x1 = 0x81;
        char x2 = 0x1;
        int a, b;
        a = x1+x2;
        b = (a>>8) & 0xFF;

        printf("a = %d, b = %d",a, b);
        return 0;
    }

为什么不使用unsigned char?@haccks练习也是如此。需要在不使用计算机的情况下确定结果。未类型化字符的默认签名由实现定义:。不使用计算机的实现会做什么?你的第一句话是错误的。实施应将字符定义为与有符号字符或无符号字符具有相同的范围、表示和行为ISO/IEC 9899:201x草案,2011年4月[我的重点]。
int main()
{
    unsigned char x1 = 0x81;
    unsigned char x2 = 0x1;
    int a, b;
    a = x1+x2;
    b = (a>>8) & 0xFF;
    printf("a = %d, b = %d",a, b);        
    return 0;
}