隐式类型转换

时间:2010-10-07 18:03:05

标签: c

#include<stdio.h>
int main(void)
{ 
  signed int a=-1;
  unsigned int b=1;
  int c= a+b;
  printf("%d\n",c);

  return 0;
  }

根据隐式类型转换规则,如果一个操作数为unsigned int,则另一个操作数将转换为unsigned int,结果将为二进制操作中的unsigned int。 所以这里bunsigned inta应该类型转换为unsigned int。因为unsigned int总是+ ve,所以a的值将是1.so c=1+1=2。但输出是0。怎么样?

3 个答案:

答案 0 :(得分:16)

-1,当转换为无符号时,将成为该类型的最大可能值 - 例如使用32位无符号,它将是4,294,967,295。当你向它添加1时,值“环绕”为0。

答案 1 :(得分:2)

“a应该类型转换为unsigned int。因为unsigned int总是+ ve,所以a的值将是1.”

纠正“将来”,但之后不得; - )

将有符号整数转换为无符号的结果在标准6.3.1.3/2中指定:

  

如果新类型是无符号的,则为值   通过重复添加或转换   减去一个以上的最大值   可以在中表示的值   新类型,直到值在   新类型的范围

换句话说,负值通过将其值模数为2的幂来转换为无符号,而不是通过翻转符号。

答案 2 :(得分:-1)

现代机器大多使用two's complement表示负数。当添加两个数字时,如果它们中的任何一个是负数,它将首先转换为二进制补码表示。然后将添加这两个数字。因此,计算机通常会1 - 1执行1 + two's complement of (-1)。结果为0。

对于1 - 2,它是1 + two's complement(-2)。检查这个程序,相同的数字,不同的表示:

int main()
{
    signed int a = 1;
    unsigned int b = -2;

    int c = a+b;

    printf("%d\n%u\n", c, c);

    return 0;
}

请阅读有关二的补码表示。你需要成为一名程序员。