簡體   English   中英

關於C中sizeof運算符的困惑

[英]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 resultsizeof(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)相同。

resultchar類型,因此sizeof1num1+num2提升為int類型,因此它給出4int大小)。

請注意,當對小於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM