История изменений
Исправление soomrack, (текущая версия) :
Я утверждаю что выбор к чему промоутить аргументы арифметической операции напрямую зависит от sizeof() вовлеченных integral types на конкретно взятой платформе, и от гипотетических диапазонов допускаемых стандартом вообще ничего не зависит. Точка.
Не без влияния пятницы, конечно…
Стандарты С и С++ отличаются в правилах что надо делать, даже называются по-разному: integer promotion (C11) vs integral promotions (C++17).
Но они одинаковы в части того, что для всего, что короче int и unsigned int – они требуют промошена именно до int или unsigned int (а не short int).
Но в этом примере вывод и С и С++ будет одинаков, произведение двух int до long int не промоутится.
unsigned char x = 0xFF;
printf("%ld\n", sizeof(x)); // 1
printf("%ld\n", sizeof(x * x)); // 4
unsigned int y = 0xFFFFFFFF;
printf("%ld\n", sizeof(y)); // 4
printf("%ld\n", sizeof(y * y)); // 4
printf("%X\n", ((y + 1)>>8)); // 0
unsigned short int z = 0xFFFF;
printf("%ld\n", sizeof(z)); // 2
printf("%ld\n", sizeof(z * z)); // 4
PS: логика всего этого, как я понимаю, в том, что вычисления идут не быстрее чем с int, поэтому все что короче можно добить до int без потери скорости, а все что длиннее – то уже сам прогер должен озаботиться как поступать… имхо.
Исправление soomrack, :
Я утверждаю что выбор к чему промоутить аргументы арифметической операции напрямую зависит от sizeof() вовлеченных integral types на конкретно взятой платформе, и от гипотетических диапазонов допускаемых стандартом вообще ничего не зависит. Точка.
Не без влияния пятницы, конечно…
Стандарты С и С++ отличаются в правилах что надо делать, даже называются по-разному: integer promotion (C11) vs integral promotions (C++17).
Но они одинаковы в части того, что для всего, что короче int и unsigned int – они требуют промошена именно до int или unsigned int (а не short int).
Но в этом примере вывод и С и С++ будет одинаков, произведение двух int до long int не промоутится.
unsigned char x = 0xFF;
printf("%ld\n", sizeof(x)); // 1
printf("%ld\n", sizeof(x * x)); // 4
unsigned int y = 0xFFFFFFFF;
printf("%ld\n", sizeof(y)); // 4
printf("%ld\n", sizeof(y * y)); // 4
printf("%X\n", ((y + 1)>>8)); // 0
unsigned short int z = 0xFFFF;
printf("%ld\n", sizeof(z)); // 2
printf("%ld\n", sizeof(z * z)); // 4
Исправление soomrack, :
Я утверждаю что выбор к чему промоутить аргументы арифметической операции напрямую зависит от sizeof() вовлеченных integral types на конкретно взятой платформе, и от гипотетических диапазонов допускаемых стандартом вообще ничего не зависит. Точка.
Не без влияния пятницы, конечно…
Стандарты С и С++ отличаются в правилах что надо делать, даже называются по-разному: integer promotion (C11) vs integral promotions (C++17).
Но они одинаковы в части того, что для всего, что короче int и unsigned int – они требуют промошена именно до int или unsigned int (а не short int).
Но в этом примере вывод и С и С++ будет одинаков, произведение двух int до long int не промоутится.
unsigned char x = 0xFF;
printf("%ld\n", sizeof(x * x)); // 4
unsigned int y = 0xFFFFFFFF;
printf("%ld\n", sizeof(y)); // 4
printf("%ld\n", sizeof(y * y)); // 4
printf("%X\n", ((y + 1)>>8)); // 0
unsigned short int z = 0xFFFF;
printf("%ld\n", sizeof(z)); // 2
printf("%ld\n", sizeof(z * z)); // 4
Исправление soomrack, :
Я утверждаю что выбор к чему промоутить аргументы арифметической операции напрямую зависит от sizeof() вовлеченных integral types на конкретно взятой платформе, и от гипотетических диапазонов допускаемых стандартом вообще ничего не зависит. Точка.
Не без влияния пятницы, конечно…
Стандарты С и С++ отличаются в правилах что надо делать, даже называются по-разному: integer promotion (C11) vs integral promotions (C++17).
Но они одинаковы в части того, что для всего, что короче int и unsigned int – они требуют промошена именно до int или unsigned int (а не short int).
Но в этом примере вывод и С и С++ будет одинаков, произведение двух int до long int не промоутится.
unsigned char x = 0xFF;
printf("%ld\n", sizeof(x * x)); // 4
unsigned int y = 0xFFFFFFFF;
printf("%ld\n", sizeof(y)); // 4
printf("%ld\n", sizeof(y * y)); // 4
printf("%X\n", ((y + 1)>>8)); // 0
Исправление soomrack, :
Я утверждаю что выбор к чему промоутить аргументы арифметической операции напрямую зависит от sizeof() вовлеченных integral types на конкретно взятой платформе, и от гипотетических диапазонов допускаемых стандартом вообще ничего не зависит. Точка.
Не без влияния пятницы, конечно…
Стандарты С и С++ отличаются в правилах что надо делать, даже называются по-разному: integer promotion (C11) vs integral promotions (C++17).
Но они одинаковы в части того, что для всего, что короче int и unsigned int – они требуют промошена именно до int или unsigned int (а не short int).
Но в этом примере вывод и С и С++ будет одинаков, произведение двух int до long int не промоутится.
unsigned char x = 0xFF;
printf("%ld\n", sizeof(x * x)); // 4
unsigned int y = 0xFFFFFFFF;
printf("%ld\n", sizeof(y)); // 4
printf("%ld\n", sizeof(y * y)); // 4
Исправление soomrack, :
Я утверждаю что выбор к чему промоутить аргументы арифметической операции напрямую зависит от sizeof() вовлеченных integral types на конкретно взятой платформе, и от гипотетических диапазонов допускаемых стандартом вообще ничего не зависит. Точка.
Не без влияния пятницы, конечно…
Стандарты С и С++ отличаются в правилах что надо делать, даже называются по-разному: integer promotion (C11) vs integral promotions (C++17).
Но они одинаковы в части того, что для всего, что короче int и unsigned int – они требуют промошена именно до int или unsigned int (а не short int).
Но в этом примере вывод и С и С++ будет одинаков, произведение двух int до long int не промоутится.
unsigned char x = 0xFF;
print("%ld\n", sizeof(x * x)); // 4
unsigned int y = 0xFFFFFFFF;
print("%ld\n", sizeof(y)); // 4
print("%ld\n", sizeof(y * y)); // 4
Исправление soomrack, :
Я утверждаю что выбор к чему промоутить аргументы арифметической операции напрямую зависит от sizeof() вовлеченных integral types на конкретно взятой платформе, и от гипотетических диапазонов допускаемых стандартом вообще ничего не зависит. Точка.
Не без влияния пятницы, конечно…
Стандарты С и С++ отличаются в правилах что надо делать, даже называются по-разному: integer promotion (C11) vs integral promotions (C++17).
Но они одинаковы в части того, что для всего, что короче int и unsigned int – они требуют промошена до int или unsigned int (а не short int).
Но в этом примере вывод и С и С++ будет одинаков, произведение двух int до long int не промоутится.
unsigned char x = 0xFF;
print("%ld\n", sizeof(x * x)); // 4
unsigned int y = 0xFFFFFFFF;
print("%ld\n", sizeof(y)); // 4
print("%ld\n", sizeof(y * y)); // 4
Исправление soomrack, :
Я утверждаю что выбор к чему промоутить аргументы арифметической операции напрямую зависит от sizeof() вовлеченных integral types на конкретно взятой платформе, и от гипотетических диапазонов допускаемых стандартом вообще ничего не зависит. Точка.
Не без влияния пятницы, конечно…
Стандарты С и С++ отличаются в правилах что надо делать, даже называются по-разному: integer promotion (C11) vs integral promotions (C++17).
Но они одинаковы в части того, что для всего, что короче int и unsigned int – они требуют промошена до int или unsigned int.
Но в этом примере вывод и С и С++ будет одинаков, произведение двух int до long int не промоутится.
unsigned char x = 0xFF;
print("%ld\n", sizeof(x * x)); // 4
unsigned int y = 0xFFFFFFFF;
print("%ld\n", sizeof(y)); // 4
print("%ld\n", sizeof(y * y)); // 4
Исходная версия soomrack, :
Я утверждаю что выбор к чему промоутить аргументы арифметической операции напрямую зависит от sizeof() вовлеченных integral types на конкретно взятой платформе, и от гипотетических диапазонов допускаемых стандартом вообще ничего не зависит. Точка.
Не без влияния пятницы, конечно…
Стандарты С и С++ отличаются в правилах что надо делать, даже называются по-разному: integer promotion (C11) vs integral promotions (C++17).
Но они одинаковы в части того, что короче int и unsigned int – они требуют промошена до int или unsigned int.
Но в этом примере вывод и С и С++ будет одинаков, произведение двух int до long int не промоутится.
unsigned char x = 0xFF;
print("%ld\n", sizeof(x * x)); // 4
unsigned int y = 0xFFFFFFFF;
print("%ld\n", sizeof(y)); // 4
print("%ld\n", sizeof(y * y)); // 4