[英]sizeof() operator in if-statement
#include <stdio.h>
int main(void)
{
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
它打印False
。 為什么 sizeof() 不在if
返回值?
無符號和有符號整數提升(更准確地說,是“通常的算術轉換”)。 sizeof
產生一個size_t
類型的值,當與一個無符號值( size_t
是)相比時,-1 被提升為該類型,並溢出並變得巨大。
無符號整數溢出具有明確定義的行為,並被視為模2 ^ width
,其中width
是特定無符號整數類型中的位數。 因此,例如,如果您有一個 32 位寬的size_t
和int
,則您的比較將等同於
if (4 > 4294967295u)
這顯然是錯誤的。
sizeof(int)
和-1
。sizeof(int)
是size_t
類型,它保證是一個無符號整數。 實際上,在任何系統上, size_t
很可能至少與unsigned int
一樣大。-1
是int
類型,它等價於signed int
。這些狀態(C11 6.3.1.8):
...
否則,如果有符號整數類型操作數的類型可以表示無符號整數類型操作數類型的所有值,則將無符號整數類型操作數轉換為有符號整數類型操作數的類型。
否則,兩個操作數都被轉換為與帶符號整數類型的操作數的類型對應的無符號整數類型。
int
不能適合size_t
所有值。-1
被轉換為無符號整數。 實際上, size_t
很可能相當於 unsigned int 或 unsigned long。 在這樣的變量中存儲 -1 時發生的任何事情都是實現定義的行為。0xFFFFFFFF
(FF 的數量取決於給定系統上 int 的大小)。4 > 0xFFFFFFFF
評估為假。 Sizeof 是一個運算符,它產生一個 unsigned long int。 因此,當您將 unsigned long int 與 -1 進行比較時,它存儲為0xffffffff
(int 的大小為 4 個字節)。
-1 默認是有符號整數。 但是,在有符號整型和無符號整型之間進行比較時,編譯器將有符號整型隱式轉換為無符號整型。 這導致無符號 -1 大約等於 4.6giga 值。
因此,輸出為false
。
只需測試一下,自己看看
#include <stdio.h>
main() {
unsigned int a=4;
int b = -1;
//this is what you're doing
printf("%u vs %u\n", a, (unsigned int)b);
//this is what you want to do instead
printf("%d vs %d\n", (int)a, b);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.