Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Hesh00
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 11
#1

U, L, F в константах - C++

27.04.2012, 22:49. Просмотров 1302. Ответов 10
Метки нет (Все метки)

Подскажите, пожалуйста, зачем использовать U, L, F в константах? В двух книгах прочитал, никак не получается разобраться.

Например, мы задаём константу:
C++
1
const unsigned a = 10;
Так зачем здесь ещё использовать "U"?

Или вышеприведённый код эквивалентен:
C++
1
const int a = 10U;
?

Или вот, читаю:
"Чтобы использовать двубайтовый символьный литерат (т.е. константу типа wchar_t), предварите нужный символ буквой L. Например, так.
C++
1
2
wchar_t wc;
wc = L'A';
Так зачем нам нужна буква "L", если мы уже определили тип как "wchar_t"?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2012, 22:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос U, L, F в константах (C++):

О динамических массивах и константах - C++
Чуток подзабыл я эту тему, а уточнить надо. Как известно, у каждой функции создаётся стек, размер которого должен быть чётко определён....

Русские символы в константах - Visual Basic
Я пользуюсь рускими символами и даже целыми предложениями в обьявлении констант Например: Enum Parametry = -2345 =...

Вычислить выражение при заданных константах - Turbo Pascal
Помогите решить и записать в виде паскаля.

Вычислите выражение при заданных константах - Turbo Pascal
1. Вычислите выражение при заданных константах: a=0.5; b=2.9; x=0.3;

Где найти информацию о константах и полях ввода? - Assembler
Интересует вариант для процесора интел 8086. Ибо о константах я нашел лиш на 1 стрн. А надо мне для мини реферата. А пересмотрел книги...

Где можно узнать о константах типа CURLOPT_PORT CURLOPT_FILE? - PHP
где можно узнать о константах типа CURLOPT_PORT CURLOPT_FILE .... .... .... .... Скачал себе полную документацию с...

О динамических массивах и константах - C++
Чуток подзабыл я эту тему, а уточнить надо. Как известно, у каждой функции создаётся стек, размер которого должен быть чётко определён....

Русские символы в константах - Visual Basic
Я пользуюсь рускими символами и даже целыми предложениями в обьявлении констант Например: Enum Parametry = -2345 =...

Вычислить выражение при заданных константах - Turbo Pascal
Помогите решить и записать в виде паскаля.

Вычислите выражение при заданных константах - Turbo Pascal
1. Вычислите выражение при заданных константах: a=0.5; b=2.9; x=0.3;

Где найти информацию о константах и полях ввода? - Assembler
Интересует вариант для процесора интел 8086. Ибо о константах я нашел лиш на 1 стрн. А надо мне для мини реферата. А пересмотрел книги...

Где можно узнать о константах типа CURLOPT_PORT CURLOPT_FILE? - PHP
где можно узнать о константах типа CURLOPT_PORT CURLOPT_FILE .... .... .... .... Скачал себе полную документацию с...

О динамических массивах и константах - C++
Чуток подзабыл я эту тему, а уточнить надо. Как известно, у каждой функции создаётся стек, размер которого должен быть чётко определён....

Русские символы в константах - Visual Basic
Я пользуюсь рускими символами и даже целыми предложениями в обьявлении констант Например: Enum Parametry = -2345 =...

Вычислить выражение при заданных константах - Turbo Pascal
Помогите решить и записать в виде паскаля.

Вычислите выражение при заданных константах - Turbo Pascal
1. Вычислите выражение при заданных константах: a=0.5; b=2.9; x=0.3;

Где найти информацию о константах и полях ввода? - Assembler
Интересует вариант для процесора интел 8086. Ибо о константах я нашел лиш на 1 стрн. А надо мне для мини реферата. А пересмотрел книги...

Где можно узнать о константах типа CURLOPT_PORT CURLOPT_FILE? - PHP
где можно узнать о константах типа CURLOPT_PORT C

О динамических массивах и константах - C++
Чуток подзабыл я эту тему, а уточнить надо. Как известно, у каждой функции создаётся стек, размер которого должен быть чётко определён....

Русские символы в константах - VB
Я пользуюсь рускими символами и даже целыми предложениями в обьявлении констант Например: Enum Parametry = -2345 =...

Вычислить выражение при заданных константах - Turbo Pascal
Помогите решить и записать в виде паскаля.

Вычислите выражение при заданных константах - Turbo Pascal
1. Вычислите выражение при заданных константах: a=0.5; b=2.9; x=0.3;

Где найти информацию о константах и полях ввода? - Assembler
Интересует вариант для процесора интел 8086. Ибо о константах я нашел лиш на 1 стрн. А надо мне для мини реферата. А пересмотрел книги...

Где можно узнать о константах типа CURLOPT_PORT CURLOPT_FILE? - PHP
где можно узнать о константах типа CURLOPT_PORT CURLOPT_FILE .... .... .... .... Скачал себе полную документацию с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
27.04.2012, 22:59 #2
это литерные константы, используется для явного указания типа.
L или l - long
U или u - unsigned
F или f - float
например, 0F указывает компилятору что вам нужен 0 типа float (с плавающей точкой), а не 0 типа int.
0
Hesh00
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 11
03.05.2012, 20:18  [ТС] #3
Ну, это понятно (читать книги умею).
Я не понимаю, зачем это нужно. Или это для того, чтобы использовать тот же ноль с плавающей точкой напрямую в выражении, а не присваивая его предварительно переменной?
0
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
03.05.2012, 21:33 #4
Я сам особо не встречал применения этих констант.
Приведу пример, не самый удачный:
допустим есть две перегруженных функции
C++
1
2
3
4
5
6
void Foo(int a){
// действия над а
}
void Foo(long b){
// действия над b
}
теперь если мы вызовем функции Foo(5), то выполнится либо первая версия, либо компилятор ругнется что есть два кандидата функции.
чтобы явно вызвать вторую версию нужно указать Foo(5L).
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
03.05.2012, 22:24 #5
Вот пример

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int r = 256;
 
int main (void)
{
  long long x = 2147483392 * r;
  long long y = 2147483392LL * r;
 
  printf("%lld\n", x);
  printf("%lld\n", y);
 
  return 0;
}
результат:

Код
-65536
549755748352
Добавлено через 8 минут
Ещё один пример:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int a = 31;
int b = 31;
 
int main (void)
{
  int x = (1 << a) >> b;
  int y = (1u << a) >> b;
 
  printf("%d\n", x);
  printf("%d\n", y);
 
  return 0;
}
Результат:

Код
-1
1
Добавлено через 1 минуту
С плавающей константой пример не получается, потому что под intel'овские процессоры компиляторы работают нечестно (т.е. не так, как того требует стандарт). Завтра на работе попробую на sparc'е
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
03.05.2012, 22:30 #6
Evg, можно поподробней пожалуйста, что требует стандарт в данном случае?
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
03.05.2012, 22:42 #7
C
1
long long x = 2147483392 * r;
В правой части мы видим константу типа int и переменную r типа int. Поэтому умножение над двумя int'ами произойдёт в формате int (т.е. 32-битное умножение, которое вызовет переполнение и откидывание старшей части). Затем при присваивании int'а в long long произойдёт преобразование типов int -> long long (т.е. int32 -> int64)

C
1
long long y = 2147483392LL * r;
В правой части стоит константа типа long long и переменная типа int. При арифметической операции над аргументами разных типов по стандарту более узкий аргумент будет приведён к типу более широкого аргумента и операция будет выполнена в типе более широкого аргумента. Поэтому сначала выполнится преобразование int -> long long для переменной "r", и только после этого будет выполнено 64-битное умножение (уже без переполнения)

Во втором примере со сдвигами вся фишка в том, что операция сдвига вправо на большинстве процессоров по разному выполняется для знаковых и беззнаковых типов. Чтобы результаты отличались, надо чтобы у сдвигаемого аргумента самый старший бит был равен единице. В своём примере я это сделал при помощи операции сдвига влево (которая одинаково работает как для знаковых, так и беззнаковых типов)
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
03.05.2012, 22:44 #8
С целочисленными то все понятно. Я про float, ты упомянул, что компиляторы под x86 хитрят.
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
03.05.2012, 22:48 #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
С целочисленными то все понятно. Я про float, ты упомянул, что компиляторы под x86 хитрят.
На интеле вся плавающая арифметика аппаратно поддержана только 80-битная, поэтому у них принято все операции проводит в формате long double. Т.е. выражение

C
1
2
3
4
double a;
float b;
 
a = a + c;
по стандарту должно считаться как

C
1
a = a + (double)b;
но компиляторы построят код

C
1
a = (double)((long double)a + (long double)b);
У gcc была какая-то опция, которая заставляет компилятор строить честный код (но он будет работать медленнее), но не помню, как называется. Возможно, что и у других компиляторов есть. А может другие компиляторы строят честно, хрен его знает. Для надёжности посмотрю на работе, sun'овский компилятор точно работает честно. Я просто intel'овскую архитектуру почти не знаю
1
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
03.05.2012, 23:13 #10
Ааааа, понятно про что Вы. Я же читал где то, у Дейтелов вроде, что все числа с плавающей точкой изначально представляются как double, а не long double. Но это С++, возможно в Си по другому.

Добавлено через 7 минут
Перепутал немного, это относится к константам.
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
04.05.2012, 12:13 #11
Про плавающие:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int r = 255;
 
int main (void)
{
 int x = 8388607.0 * r;
 int y = 8388607.0f * r;
 
 printf("%d\n", x);
 printf("%d\n", y);
 
 return 0;
}
Результат на sparc'е:

Код
$ gcc t.c
$ ./a.out
2139094785
2139094784
В случае intel'а потребовалась дополнительная опция

Код
$ gcc t.c -ffloat-store
$ ./a.out
2139094785
2139094784
0
04.05.2012, 12:13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru