繁体   English   中英

size_t用作公式中的值

[英]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)被简单地被用来作为铸:铸造-1size_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM