[英]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.