[C-prog-lang-l] Arithmetic conversions and sizes of types in limits.h
Walter Herold Veedla
walterheroldv at gmail.com
Tue Mar 15 23:54:13 CET 2022
Hello,
I was thinking about the integer promotion topic that we talked about
this Monday and I think I have an interesting observation that was not
explicitly mentioned in class as well as a question.
I dug around in limits.h
(https://opensource.apple.com/source/xnu/xnu-201/EXTERNAL_HEADERS/machine/limits.h.auto.html)
and noticed the asymmetric definition of INT_MAX and INT_MIN:
#define __INT_MAX__ 2147483647
#define INT_MIN (-INT_MAX-1)
Which puzzled me for a bit and made me think of the question why we do
not define
#define INT_MIN -2147483648
instead? After all, this is the value you get when you print out
INT_MIN. My hunch is that what is mentioned in notes5.md under integer
promotion (but this is not integer *promotion*, is it?) is also
happening here and the value 2147483648 does not fit the value of
integer due to the asymmetrical range of two's complement and is first
converted to long, before the unary minus is applied. Is that correct?
Secondly, whereas INT_MAX and INT_MIN are defined in this asymmetric
way, CHAR_MIN, CHAR_MAX, SHRT_MIN, SHRT_MAX are not, see:
#define CHAR_MAX 127
#define CHAR_MIN (-128)
#define SHRT_MAX 32767
#define SHRT_MIN (-32768)
This is really strange, furthermore when printing the sizes of these
quantities they do not correspond to the sizes of the types, but even
CHAR_MAX is 4 bytes. See the following output:
cc -std=c99 -Wall -Wextra -pedantic limits_test.c && ./a.out
| 1 #include <stdio.h>
sizeof(short) = 2
| 2 #include <limits.h>
sizeof(int) = 4 | 3
sizeof(long) = 8
| 4 int
INT_MAX = 2147483647 (4 bytes)
| 5 main(void)
8 = sizeof(-2147483648) | 6 {
4 = sizeof(-INT_MAX-1) | 7 printf("sizeof(short)\t= %zu\n",
sizeof(short));
| 8 printf("sizeof(int)\t= %zu\n", sizeof(int));
| 9 printf("sizeof(long)\t= %zu\n", sizeof(long));
SHRT_MAX = 32767 (4 bytes) | 10
4 = sizeof(-32768) | 11 // The below is -INT_MAX-1 written
directly
4 = sizeof(-SHRT_MAX-1) | 12 printf("INT_MAX = %d (%zu
bytes)\n", INT_MAX, sizeof(INT_MAX));
|
13 printf("%zu = sizeof(-2147483648)\n", sizeof(-2147483648));
|
14 printf("%zu = sizeof(-INT_MAX-1)\n", sizeof(-INT_MAX-1));
CHAR_MAX = 127 (4 bytes) | 15
4 = sizeof(-32768) | 16 printf("\n\n");
4 = sizeof(-SHRT_MAX-1) | 17
|
18 printf("SHRT_MAX = %d (%zu bytes)\n", SHRT_MAX,
sizeof(SHRT_MAX));
|
19 printf("%zu = sizeof(-32768)\n", sizeof(-32768));
|
20 printf("%zu = sizeof(-SHRT_MAX-1)\n", sizeof(-SHRT_MAX-1));
| 21
|
22 printf("\n\n");
| 23
|
24 printf("CHAR_MAX = %d (%zu bytes)\n", CHAR_MAX,
sizeof(CHAR_MAX));
|
25 printf("%zu = sizeof(-32768)\n", sizeof(-32768));
|
26 printf("%zu = sizeof(-SHRT_MAX-1)\n", sizeof(-SHRT_MAX-1));
| 27 }
What is going on here?
If for some reason the output of the program arrives mis-formatted, I am
also attaching a .txt file of the output with this e-mail.
Anyways, I'd be happy to hear Your thoughts.
Kind regards
Walter Herold Veedla
-------------- next part --------------
HTML attachment scrubbed and removed
-------------- next part --------------
cc -std=c99 -Wall -Wextra -pedantic limits_test.c && ./a.out | 1 #include <stdio.h>
sizeof(short) = 2 | 2 #include <limits.h>
sizeof(int) = 4 | 3
sizeof(long) = 8 | 4 int
INT_MAX = 2147483647 (4 bytes) | 5 main(void)
8 = sizeof(-2147483648) | 6 {
4 = sizeof(-INT_MAX-1) | 7 printf("sizeof(short)\t= %zu\n", sizeof(short));
| 8 printf("sizeof(int)\t= %zu\n", sizeof(int));
| 9 printf("sizeof(long)\t= %zu\n", sizeof(long));
SHRT_MAX = 32767 (4 bytes) | 10
4 = sizeof(-32768) | 11 // The below is -INT_MAX-1 written directly
4 = sizeof(-SHRT_MAX-1) | 12 printf("INT_MAX = %d (%zu bytes)\n", INT_MAX, sizeof(INT_MAX));
| 13 printf("%zu = sizeof(-2147483648)\n", sizeof(-2147483648));
| 14 printf("%zu = sizeof(-INT_MAX-1)\n", sizeof(-INT_MAX-1));
CHAR_MAX = 127 (4 bytes) | 15
4 = sizeof(-32768) | 16 printf("\n\n");
4 = sizeof(-SHRT_MAX-1) | 17
| 18 printf("SHRT_MAX = %d (%zu bytes)\n", SHRT_MAX, sizeof(SHRT_MAX));
| 19 printf("%zu = sizeof(-32768)\n", sizeof(-32768));
| 20 printf("%zu = sizeof(-SHRT_MAX-1)\n", sizeof(-SHRT_MAX-1));
| 21
| 22 printf("\n\n");
| 23
| 24 printf("CHAR_MAX = %d (%zu bytes)\n", CHAR_MAX, sizeof(CHAR_MAX));
| 25 printf("%zu = sizeof(-32768)\n", sizeof(-32768));
| 26 printf("%zu = sizeof(-SHRT_MAX-1)\n", sizeof(-SHRT_MAX-1));
| 27 }
More information about the c-prog-lang-l
mailing list