C中应该使用哪种类型来表示两个对象大小之间的差异?
像size_t未签名的那样
size_t diff = sizeof (small_struct) - sizeof (big_struct);
Run Code Online (Sandbox Code Playgroud)
显然不正确,在我看来,没有真正的签名等价物.
ptrdiff_t 听起来很诱人,但是
ptrdiff_t这样的32位平台也不会这样吗?如果是这样,两个对象的大小之间的差异只需要16位,但使用ptrdiff_t会得到一个32位宽的变量,使其不是最佳的.那么,什么是适合这种价值的便携式?
Edit:
我知道ssize_t,但它是
Ben*_*son 18
当我真的担心像这样的溢出问题时(特别是在使用模块化算术时,"负"值包装在其他地方除外~0)我只是把它分成两种情况:
if (a > b) {
size_t diff = a - b;
} else {
size_t diff = b - a;
// code here subtracts diff rather than adds it, etc.
}
Run Code Online (Sandbox Code Playgroud)
没有标准的数据类型可以保证100%安全,无法满足您的要求.为了证据,想象一下,如果size_t真的是公正的uint64_t,那是完全可能的.然后没有标准C数据类型保证具有匹配的正范围uint64_t并且还处理负值.
所以对你的问题的直接回答是"没有数据类型"(假设严格遵守标准C,你似乎希望这样).
但是,您不清楚您的用例,并且您可能可以利用模运算来处理"负"值.例如,下面的代码会导致d2被4因为模运算,允许代码充当如果size_t签署:
#include <stdio.h>
#include <stdint.h>
int main()
{
size_t d1 = sizeof(int32_t) - sizeof(int64_t);
size_t d2 = sizeof(int64_t) + d1; // Add difference (even if d1 is "negative"*)
printf("d1: %zu\n", d1);
printf("d2: %zu\n", d2);
return 0;
// * By "negative" I mean that d1 would be negative if size_t were signed
}
Run Code Online (Sandbox Code Playgroud)
在您的情况下,模块化算术可能不够,但对于其他人可能.