C 有符号到无符号的转换

C 有符号到无符号的转换,c,C,可能重复: 请参阅此代码 #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) int array[] = {23,34,12,17,204,99,16}; int main() { int d; for(d=-1;d <= TOTAL_ELEMENTS-2;d++) printf("%d\n",array[d+1]); retu

可能重复:

请参阅此代码

  #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) 

  int array[] = {23,34,12,17,204,99,16}; 

  int main() 

  { 

      int d; 

      for(d=-1;d <= TOTAL_ELEMENTS-2;d++) 
          printf("%d\n",array[d+1]); 

      return 0;

  } 
现在这个循环不会运行。 sizeof将返回一个无符号值,因此TOTAL_元素具有一个无符号值。
现在,在for循环中,请告诉我一元运算符“-”是否对有符号int 2起作用,或者隐式转换为无符号,然后“-”运算符起作用

我怀疑要传播到表达式TOTAL_ELEMENTS-2,然后传播到示例d中的两个操作数的sizeof的无符号类型在比较中被转换为无符号int。但是-1不能表示为无符号int值,因此将其转换为UINT_uumax。为了避免这种行为,可以通过在int前面加上前缀,将比较的右侧转换为有符号int


有关C中整数转换的详细信息,请参阅。

在d中没有一元运算符是的,由于提升,d在该表达式中也有一个无符号类型,这就是循环失败的原因

然而,问题是C编译器是否认为:

无符号5-无符号2

i、 e.将2升级为未签名,或:

无符号无符号5-有符号2

i、 e.采用两种类型操作数的减法。当然,这没关系,因为这两种方法都是一样的。然而,关键是减法将返回一种类型的值,因此理论上它只能接受该类型的参数。这是第一个无符号整数2


p.S.-2是一元数,而5-2是二元数。

看,一元数的“-”运算符是一件愚蠢的事情。算了吧。我意识到这是二元数“-”

当2被转换成无符号整数时,它就变成了无符号2,所以TOTAL_ELEMENTS-2的值等于无符号5,然后当d被转换成无符号整数时,它会得到一个大的正值,并且 所以循环失败了

这是在这里发生的吗

是的,我没有写这段代码,这是我在网上发现的一些c拼图。
谢谢大家。

我无法决定是否喜欢这个问题,因为它指出了一个人们经常忽略或讨厌的细节,因为示例代码显然是糟糕的代码。我希望它只是为了显示问题而写的,在现实生活中并不存在。这是一个相当人工的问题——更好的例子是检查一个有符号的数字是否低于最大值,然后将其传递给malloc。这是问题的前提。然而,我想他是在问算术转换规则。我试图指出代码不起作用的原因,并提供了一个链接,指向解释升级规则的文档。当然,为了给出一个完整的答案,我应该解释一下规则,并解释在从TOTAL_元素中减去2之前,2会被转换成一个无符号的it。