Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does sizeof(char + char) return 4?

Tags:

c

char

sizeof

char  a, b;     
printf("%d", sizeof(a+b));

What will printf write to the screen?

I thought because sizeof(char)=1, that sizeof(a+b) will be also 1, but it turned out to be 4. I don't understand this, why does it write 4 if we are adding two chars?

like image 791
Nebeski Avatar asked Feb 09 '16 19:02

Nebeski


People also ask

Why is sizeof a 4?

'a' by default is an integer and because of that you get size of int in your machine 4 bytes. char is 1 bytes and because of this you get 1 bytes.

What does sizeof char return?

sizeof always returns size as the number of bytes.

Is a char 4 bytes?

The char type takes 1 byte of memory (8 bits) and allows expressing in the binary notation 2^8=256 values.

Is sizeof char guaranteed to be 1?

Even if you think of a “character” as a multi-byte thingy, char is not. sizeof(char) is always exactly 1. No exceptions, ever.


2 Answers

In C language operands of almost all arithmetic operators are subjected to implicit conversions called usual arithmetic conversions or, in this case, integer promotions. Operands of type char are promoted to type int and the actual addition is performed within the domain of int (or unsigned int, depending on the properties of char on that platform). So your a + b is actually interpreted as (int) a + (int) b. The result has type int and sizeof(int) is apparently 4 on your platform. That 4 is what you see.

And don't use %d to printf the result of sizeof. The result of sizeof has type size_t, while %d requires an int argument. So, either use the proper format specifier

printf("%zu\n", sizeof(a+b));

or at least cast the argument if you are sure it fits

printf("%d\n", (int) sizeof(a+b));
like image 172
AnT Avatar answered Oct 01 '22 05:10

AnT


This is not the same as sizeof(char), the argument (i.e. the result of the addition) is promoted to int so sizeof(a + b) is in fact equivalent to sizeof(int). If you cast the result to char it will be what you expect. Also, the correct format specifier for sizeof result which is size_t is %zu and not %d.

Try

printf("%zu", sizeof((char) (a + b)));
like image 31
Iharob Al Asimi Avatar answered Oct 01 '22 07:10

Iharob Al Asimi