LINUX.ORG.RU

История изменений

Исправление 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