簡體   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