当前位置: 首页 > 知识库问答 >
问题:

将普通算术与指针算术进行比较

奚飞星
2023-03-14

我在64位机器上的C程序出错。错误如下。为了完全理解错误,我尝试了程序的一些变体,以查看何时没有出现错误/警告。随着变化,我希望更好地理解它。

这些程序是用

gcc -Wall -Werror -Wextra

错误:有符号和无符号整数表达式之间的比较

这个程序给了我错误。这就是我看到的模式。

  • sizeof返回size_t,它是一个无符号长整数。
  • len被提升为unsigned long int,作为常规算术的一部分,因此它可以从size_t
  • 中减去
  • 使用ptr和ptr2的普通算术
  • len是10,所以len-sizeof(unint32_t)将产生6,这是一个正数
#include <cstdio>
#include "stdint.h"

int main()
{
uint16_t len =10; 
uint8_t number  =5; 
uint8_t number2  =10; 
uint8_t * ptr =&number;
uint8_t * ptr2 =&number2;

        if(len - sizeof(uint32_t) < ptr -ptr2)
        {   
                 printf("done\n");
        }   
return 0;
}

这段代码编译的文件没有上面的错误。我从中看到的模式是

  • 它们是同一类型的
  • 没有整数提升,因为都是整数。
  • 指针减法必须返回无符号int类型,以便与左侧匹配。
#include <cstdio>
#include "stdint.h"

int main()
{
uint32_t len =1; 
uint32_t len2 =3; 
uint32_t number  =5; 
uint32_t number2  =10; 
uint32_t * ptr =&number;
uint32_t * ptr2 =&number2;

    if(len - len2 < ptr -ptr2)
    {
        printf("Worked\n");
    }
}

这个程序编译良好,没有上述错误。我在这里看到的模式

  • len和len2的整数提升为32位整数,因此
    可以减去它们。
  • ptr-ptr2的普通指针算法。
#include <cstdio>
#include "stdint.h"

int main()
{
uint16_t len =2;
uint16_t len2 =5;
uint8_t number  =5; 
uint8_t number2  =10; 
uint8_t * ptr =&number;
uint8_t * ptr2 =&number2;

    if(len - len2 < ptr -ptr2)
    {
         printf("done\n");
    }
}

问题

  • ptr-ptr2的减法是否返回ptrdiff_t类型,即有符号整数类型?如果是这样,则正常工作的2个程序将左侧类型提升为有符号整数,因为它们是uint16和uint8,并且它们的值可以放在有符号整数中。所以正在工作的2个程序被比较为有符号整数

感谢您的任何帮助

共有1个答案

满元凯
2023-03-14

我想是时候有人把我们在评论中学到的东西变成答案了,所以开始了。

在此实现下,<code>size_t</code>是一个无符号64位整数,<code>ptrdiff_t<-code>则是一个有符号的64位整数。

在第一次比较中,< code>if(len - sizeof(uint32_t)

在其他情况下(如果(len - len2

 类似资料:
  • 正如在主要章节中所解释的,Pascal指针是一个地址,它是存储在单词中的数值。 因此,您可以像对数值一样对指针执行算术运算。 有四个算术运算符可用于指针:递增,递减,+和 - 。 为了理解指针运算,让我们考虑ptr是一个整数指针,它指向地址1000.假设32位整数,让我们对指针执行递增操作 - Inc(ptr); 现在,在上述操作之后, ptr将指向位置1004,因为每次ptr递增时,它将指向下

  • 如你所知,指针是一个数值的地址; 因此,您可以像对数值一样对指针执行算术运算。 可以在指针上使用四个算术运算符:++, - ,+和 - 要理解指针运算,让我们考虑ptr是一个指向地址1000的整数指针。假设32位整数,让我们对指针执行以下算术运算 - ptr++ ptr将指向位置1004,因为每次ptr递增时,它将指向下一个整数。 此操作将指针移动到下一个存储器位置,而不会影响存储器位置的实际值

  • c中的指针是地址,它是一个数值。 因此,您可以像对数值一样对指针执行算术运算。 可以在指针上使用四个算术运算符:++, - ,+和 - 要理解指针运算,让我们考虑ptr是一个指向地址1000的整数指针。假设32位整数,让我们对指针执行以下算术运算 - ptr++ 在上述操作之后, ptr将指向位置1004,因为每次ptr递增时,它将指向下一个整数位置,该位置是当前位置旁边的4个字节。 此操作将指

  • C++ 指针 指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。 假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算: ptr++ 在执行完上述的运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。这个运算会在

  • 问题内容: 使用算术运算符比较是否为内置类型(在这种情况下为整数)进行了定义? 语言规范的前两个比较部分和第三个比较部分之间的区别(Python的规范-您一定是在开玩笑))还是CPython的实现细节? 问题答案: 您真正可以使用的唯一有意义的比较是(或)。 出于各种原因,已从Python 3中删除了不同类型之间的比较-它们是常见的错误来源,并导致混乱。例如 在Python 3中,比较不同类型的值

  • 下面是我的一个非常简单的问题: 如何使用RStudio计算vector_a和vector_b值之间的和、差和积。 和 它返回一个错误! 谁能解释这些基本计算的正确命令是什么?