c语言 - 为什么使用long作为数据类型会使"隐式转换失去整数精度"消失?



我知道这个标题有很多问题,但我不是在寻找解决方案。我想知道为什么会这样。 我有这个作为解决方案

int points[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *pos = points + 5;
int index = pos - points;

但是当我使用该代码时,我收到警告隐式转换会丢失整数精度:"long"到"int"。现在当我使用长而不是索引的数据类型时

int points[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *pos = points + 5;
long index = pos - points;

它没有给出任何警告。我尝试使用长,因为我记得一些关于指针和长的东西。但是指针没有数据类型(如果我错了,请纠正我)。点和 *pos 都使用 int 初始化。那么为什么长拟合和 int 没有呢?

为什么他们在解决方案中使用 int?解决方案是错误的还是关于xCode(我正在使用)?

谢谢你的回答

但是当我使用该代码时,我收到警告隐式转换会丢失整数精度:"long"到"int"。

这意味着在您的平台上,两个指针的差异是long型 .

我尝试使用长,因为我记得一些关于指针和长的东西。但是指针没有数据类型(如果我错了,请纠正我)。

你错了,所有东西都有 C 中的类型,指针有指针类型。两个指针之间的区别是有符号整数类型,但标准没有指定哪一个,不同的平台将使用不同的类型。

但是该标准通过名称ptrdiff_t(在stddef.h中定义)指定一个typedef,必须将其定义为指针差的有符号整数类型,因此这是您应该用于所显示代码类型的类型。

点和 *pos 都使用 int 初始化。那么为什么长拟合和 int 没有呢?

指针指向的类型与指针本身不同。指针是地址,在系统上,地址可以大于int值。

为什么他们在解决方案中使用 int?解决方案是错误的吗

是的,这是错误的。如上所述,表达式pos - points某种有符号整数类型,在某些平台上它可能是一个int,但你不能假设。

当然,以下内容也可以:

int points[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *pos = points + 5;
int index = (int)(pos - points);

在此示例中,您知道结果可以用int表示,因此您可以通过显式强制转换来转换它。但一般不要这样做。

index = pos - points;是两个指针之间的减法,其中类型必须ptrdiff_t

以下是 C11 标准委员会草案 N1570 § 6.5.6 中的描述:

9 .当减去两个指针时,两个指针都应指向 相同的数组对象,或超过数组最后一个元素的对象 对象;结果是两者下标的差异 数组元素。结果的大小是实现定义的,并且 其类型(有符号整数类型)ptrdiff_t<stddef.h>标头。

在您的系统中,碰巧类型ptrdiff_t可能是longtypedef,就像 @FelixPalmen 的评论中提到的那样,这就是为什么当您将index声明为int时编译器会抱怨的原因。

最新更新