gpt4 book ai didi

比较 ptrdiff_t 和 size_t

转载 作者:行者123 更新时间:2023-12-04 10:51:14 29 4
gpt4 key购买 nike

我对以下简单比较有疑问:

#define BUF_SIZE //maybe large

static char buf[BUF_SIZE];

static char *limit; // some pointer to an element of buf array

void foo(){
if(limit - buf <= sizeof buf){ //<---- This comparison
//...
}
//...
}

这里我们比较 ptrdiff_t (左侧)已签名和 size_t (右侧)未签名。本标准提供以下说明
6.5.8/3 :

If both of the operands have arithmetic type, the usual arithmetic conversions are performed.


6.3.1.8/1给了我们3种可能性:

Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand, then the operand with signed integer type is converted to the type of the operand with unsigned integer type.

Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, then the operand with unsigned integer type is converted to the type of the operand with signed integer type.

Otherwise, both operands are converted to the unsigned integer type corresponding to the type of the operand with signed integer type.



我们不知道 ptrdiff_t 的转化排名和 size_t .此外,对于 ptrdiff_t,通常没有相应的无符号类型。 (不像,说 intptr_tuintptr_t )。

问题 :假设转换等级为 ptrdiff_t严格大于 size_tptrdiff_t不能代表 size_t的所有值.在 ptrdiff_t之间进行比较时会发生什么和 size_t假设 ptrdiff_t 没有对应的无符号整数类型.甚至允许这样的实现吗?

最佳答案

ptrdiff_t等级高于 size_t并且可以表示size_t的所有正值. limit - buf <= sizeof buf那么没有问题。比较完成为 ptrdiff_t .

其他 ptrdiff_t可能不代表 size_t 的所有正值然后减法limit - buf可能是 UB per 下面,所以比较是 moot .

J.2 Undefined behavior
The behavior is undefined in the following circumstances:
...
The result of subtracting two pointers is not representable in an object of type ptrdiff_t (6.5.6).



Is such an implementation even allowed? (conversion rank of ptrdiff_t is strictly greater than of size_t and ptrdiff_t cannot represent all the values of size_t)



可以允许为 ptrdiff_tlongsize_tunsigned .都是 32 位的。但也许并不明智。

注:C17 § 7.19 4 有

推荐做法
用于 size_t 的类型和 ptrdiff_t不应具有大于 signed long int 的整数转换等级除非实现支持足够大的对象以使其成为必要。

并不是说这在这里很适用 - 只是一个说明。

关于比较 ptrdiff_t 和 size_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59463802/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com