[英]size_t used as a value in a formula
这是功能阅读线的简短片段。 它如何将bufsize
与((size_t)-1)/2
?
我想象过将变量与例如。 int
那是不可能的; 我认为与INT_MAX相反是正确的。 那么,该代码如何真正起作用并且没有错误呢?
int c;
size_t bufsize = 0;
size_t size = 0;
while((c=fgetc(infile)) != EOF) {
if (size >= bufsize) {
if (bufsize == 0)
bufsize = 2;
else if (bufsize <= ((size_t)-1)/2)
bufsize = 2*size;
else {
free(line);
exit(3);
}
newbuf = realloc(line,bufsize);
if (!newbuf) {
free(line);
abort();
}
line = newbuf;
}
/* some other operations */
}
(size_t)-1
这size_t
值-1
强制转换为size_t
。 (type)value
是C语言中的强制(type)value
。
由于size_t
是无符号类型,因此实际上是size_t
可以容纳的最大值,因此用于确保缓冲区大小实际上可以安全地翻倍(因此,随后的二分之一)。
(size_t)-1
铸-1
的类型size_t
,这导致SIZE_MAX
(在stdint.h中定义的宏),该最大值size_t
类型可以容纳。
因此,比较是检查bufsize
是否小于或等于size_t
可以包含的最大值的一半。
该代码基于一些有关位的假设,然后进行众所周知的破解以找到最大size_t值(前提是size_t所容纳的位不多于寄存器,这在许多机器上都是安全的选择)。
首先,它用1
位填充一个寄存器,然后将其转换为size_t
数据类型,因此比较将起作用。 只要该寄存器的位数大于size_t
数据类型的位数,那么(如果有的话)未使用的1
位将被截断,并且您将获得可以容纳在size_t
位中的最大无符号数。
获得该值之后,它将除以2得到该数字的一半,然后进行比较以查看在不超过“ maximum” size_t
情况下增大大小似乎是安全的。 但是到那时,它将划分一个size_t
数据类型,并比较两个size_t
数据类型(一种类型安全的操作)。
如果您真的想消除这种奇怪的想法(好吧,这不是我所见过的最糟糕的巫师示例)。 考虑以下代码段
else if (bufsize <= ((size_t)-1)/2)
bufsize = 2*size;
可以替换为
else if (bufsize <= (MAX_SIZE/2)
bufsize = 2*size;
并且类型安全, 无需强制转换且更具可读性。
所述size_t
在((size_t)-1)/2)
被简单地被用来作为铸:铸造-1
至size_t
。
这里的窍门是size_t
是无符号的,因此(size_t) -1
转换(size_t) -1
将转换为size_t
的最大值,即SIZE_MAX
。 这在循环的上下文中很有用。 但是,我更希望直接使用SIZE_MAX
,而不是这种技巧。
size_t不会被解释为值,而是用于将负1的值强制转换为type_t类型。
((size_t)-1)/2
将-1转换为size_t,然后除以2。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.