使用位。溢出

时间:2015-06-04 09:06:14

标签: c bits

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;
    }

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

x1是1000 0001

x2是0000 0001

Sum = 1000 0010,因此它是130.但是,因为" char"的情况,130超过了8位(128)上表示的最大可能值。 在这种情况下我该怎么办?感谢。

3 个答案:

答案 0 :(得分:1)

  1. 只需[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (error || data == nil) { // handle the error } else { // process the response data } }]; x1+x2
  2. 当结果存储到1000 0010时,符号会延长, 因此signed integera,其中1111 1111 1000 0010为两种赞美格式。几乎所有计算机都以两种恭维格式存储负数。 因此,126D被解释为a
  3. 现在-126 因此b = (1111 1111 1000 0010 >> 8 ) & (0000 0000 1111 1111)
  4. 假设:

    1. 您的编译器将整数视为32位。

    2. 负数以2的赞美格式表示。

答案 1 :(得分:1)

在C中,默认情况下,char声明为signed char ( - 127到+127)。如果你想增加范围,那么你必须使它unsigned char (0到+255)

因此,以下代码段将适用于您

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;
}

答案 2 :(得分:0)

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

当你添加-127和1时,得到总和-126。 1000 0010

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