2016-07-14 3 views
7

Я путать о sizeof оператора в C.Путаница SIZEOF оператора в C

#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 соответственно. Почему это происходит?

+0

'sizeof (num1 + num2)' логически ошибочно. – i486

+3

@ i486 Что значит? – Jin

+0

@jwqwerty: Нелогично неправильно, но бесполезно, поскольку вы получаете размер временного объекта, который существует только на время определения его размера. В повседневном использовании вы будете искать 'sizeof (num1) + sizeof (num2)', если вы, например, хотите выделить пространство для сериализации данных. –

ответ

4

result имеет char типа, поэтому sizeof дает 1 в то время как num1+num2 повышен до int типа и, следовательно, это дает 4 (размер int).

Обратите внимание, что, когда арифметическая операция выполняется на типа меньшего, чем у int и все его значение может быть представлено int, то результатом будет повышен до int типа.

+0

Почему num1 + num2 повышается до типа int? – Jin

+0

@jwqwerty; Из-за арифметической операции. – haccks

+0

@ haccks3 Тогда я предполагаю, что в строке «result = num1 + num2» num1 + num2 также должен быть повышен до int, потому что он включает в себя аритмическую операцию? – Jin

3

num1 + пит2 становится целым числом и, следовательно, выходной сигнал равен 4, тогда как результат, который выводит символ 1.

Вы можете обратиться эту статью Integer Promotion:

Если INT может представлять все значения исходного типа, значение преобразуется в int; в противном случае он преобразуется в unsigned int. Они называются целыми акциями. Все остальные типы не изменяются целыми рекламными акциями.

5

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,/р2,

Если int может представлять все значения исходного типа (как ограниченное по ширине, для битового поля), значение преобразуется в int; в противном случае он преобразуется в unsigned int. Они называются целыми рекламными акциями.

Таким образом, sizeof(num1+num2) - это то же самое, что и sizeof(int).

0

размер одного символа равен 1 байт, символ может содержать значения до 127 (без знака до 255). , когда вы говорите что-то вроде (a + b), создается временная переменная и используется для добавления a в b, потому что a и b могут содержать только 127, для этого компилятор продвигается как int, чтобы быть уверенным.

, что является логичным, потому что, если a = 100 и b = 100, пользователь хотел бы видеть 200, когда он добавляет их, а не 73 (что является результатом переполнения).

Смежные вопросы