[英]Confusion about sizeof operator in C
我對C中的sizeof
運算符感到困惑。
#include <stdio.h>
int main(void)
{
char num1=1, num2=2, result;
result = num1 + num2;
printf("Size of result: %d \n",sizeof result);
printf("Size of result: %d \n",sizeof(num1+num2));
}
結果分別為1和4。 為什么會這樣?
TL; DR回答:
sizeof result
與sizeof(char)
相同。 sizeof(num1+ num2)
與sizeof (int)
相同為什么? 在您的情況下,它們分別產生1(標准保證)和4(可能變化)。
也就是說 , sizeof
產生類型size_t
的結果,因此你應該使用%zu
格式說明符來打印該值。
為什么:
首先,對於加法運算符+
,引用C11
,章節§6.5.6
如果兩個操作數都具有算術類型,則對它們執行通常的算術轉換。
關於通常的算術轉換 ,§6.3.1.8/ p1
[....]否則,將對兩個操作數執行整數提升 。[...]
然后從§6.3.1.1,/ p2開始,
如果
int
可以表示原始類型的所有值(由寬度限制,對於位字段),則該值將轉換為int
; 否則,它將轉換為unsigned int
。 這些被稱為整數促銷 。
因此, sizeof(num1+num2)
與sizeof(int)
相同。
result
是char
類型,因此sizeof
為1
而num1+num2
提升為int
類型,因此它給出4
( int
大小)。
請注意,當對小於int
的類型執行算術運算時,所有值的值都可以用int
表示,那么result將被提升為int
類型。
num1 + num2變為整數,因此輸出為4,而result為char,輸出1。
你可以參考這篇文章整數推廣 :
如果int可以表示原始類型的所有值,則該值將轉換為int; 否則,它將轉換為unsigned int。 這些被稱為整數促銷。 整數促銷不會更改所有其他類型。
一個char的大小是1byte,char可以保存最多127個值(無符號最多255個)。 當你說(a + b)之類的東西時,會創建一個臨時變量並用於向b添加a,因為a和b只能容納127,所以編譯器將它們提升為int,只是為了確定。
這是合乎邏輯的,因為如果a = 100且b = 100,用戶希望在添加它們時看到200而不是73(這是溢出的結果)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.