реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Снова по преобразованию типов )
TeddyIn
сообщение Jan 7 2009, 14:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 4-01-09
Из: Владивосток
Пользователь №: 42 911



к примеру

Код
unsigned int f, a,b,c;

f = ((a+b)*c*a)/6556


в итоге нужно, чтобы f осталась unsigned int (известно, результат влазит в размерность unsigned int ) но по ходу вычислений образуются значения, превышающие этот тип, поэтому

Код
unsigned int f, a,b,c;

f = (( (unsigned long int)a+(unsigned long int)b)*(unsigned long int)c*(unsigned long int)a)/6556


А f же все равно должна получиться unsigned int. - Правильно ли я понимаю, и увеличится ли объем программной памяти, если использовать описанное явное приведение по сравнению с первым вариантом?


--------------------
висячий монтаж -> лак - > ЦЛ - > ЛУТ - > ФР - > ?
оу -> стабилизаторы - > драйверы -> микроконтроллеры - > ?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 7 2009, 14:42
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(TeddyIn @ Jan 7 2009, 18:28) *
Правильно ли я понимаю, и увеличится ли объем программной памяти, если использовать описанное явное приведение по сравнению с первым вариантом?

crying.gif Мне это тоже мешает жить во многих случаях. Про объем можно не переживать, т.к. mul32 может ведь где-то еще использоваться, а про время выполнения...
В общем, в любом случае, нужно явное приведение типов, но достаточно так:
Код
f =  (unsigned long int)(a+b)*c*a/6556

А компиляторы - вон, EWAVR 5.20, "сообразил", что надо , остальные - нет. Пример для EWAVR vs WinAVR как раз из-за того, что там это из самых актуальных вопросов.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 7 2009, 14:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Тут еще от используемой архитектуры зависит. Например, на ARM и X86 int может иметь такую же разрядность, что и long. Т.е. 32 разряда.
Кстати, в последнем выражении количество явных приведений типа можно сократить.
Код
f = (( (unsigned long)a+b)*(unsigned long)c*a)/6556
Go to the top of the page
 
+Quote Post
TeddyIn
сообщение Jan 7 2009, 14:54
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 4-01-09
Из: Владивосток
Пользователь №: 42 911



Цитата
но достаточно так:

Цитата
Кстати, в последнем выражении количество явных приведений типа можно сократить.

Спасибо, меньше писанины )
архитектура с51, компилятор Keil.
Мдааа, а я то думал, что раз в книжке "програм-е МК на Си" написано, что char = 8bit, int = 16bit, long - 32... то так оно и есть, оказывается нужно еще и аритектуру учитывать


--------------------
висячий монтаж -> лак - > ЦЛ - > ЛУТ - > ФР - > ?
оу -> стабилизаторы - > драйверы -> микроконтроллеры - > ?
Go to the top of the page
 
+Quote Post
тау
сообщение Jan 7 2009, 15:05
Сообщение #5


.
******

Группа: Участник
Сообщений: 2 424
Регистрация: 25-12-08
Пользователь №: 42 757



Цитата(rezident @ Jan 7 2009, 17:43) *
Тут еще от используемой архитектуры зависит. Например, на ARM и X86 int может иметь такую же разрядность, что и long. Т.е. 32 разряда.
Кстати, в последнем выражении количество явных приведений типа можно сократить.
Код
f = (( (unsigned long)a+b)*(unsigned long)c*a)/6556

5 копеек по возможному ускорению и уменьшению чутка кода.
Если TeddyIn уверен что a+b не вылезет за пределы uint, то smile.gif
Код
f = ((a+b)*(unsigned long)c*a)/6556
Go to the top of the page
 
+Quote Post
TeddyIn
сообщение Jan 7 2009, 15:16
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 4-01-09
Из: Владивосток
Пользователь №: 42 911



Цитата
5 копеек по возможному ускорению


Совершенству нет предела! beer.gif


--------------------
висячий монтаж -> лак - > ЦЛ - > ЛУТ - > ФР - > ?
оу -> стабилизаторы - > драйверы -> микроконтроллеры - > ?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 7 2009, 15:24
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(TeddyIn @ Jan 7 2009, 17:54) *
Мдааа, а я то думал, что раз в книжке....

"Книжек по 'C'" ровно две - стандарт языка C99 и вольного стиля K&R 2nd Edition. Все остальное, как минимум не нужно, как максимум вредно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Kompot
сообщение Jan 7 2009, 15:27
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 10-06-08
Из: Хочу в пампасы...
Пользователь №: 38 192



Цитата(TeddyIn @ Jan 7 2009, 18:54) *
Спасибо, меньше писанины )
архитектура с51, компилятор Keil.
Мдааа, а я то думал, что раз в книжке "програм-е МК на Си" написано, что char = 8bit, int = 16bit, long - 32... то так оно и есть, оказывается нужно еще и аритектуру учитывать



Доступнее всего об этом написано у Кернигана и Ричи. "Язык программирования Си". Настоятельно советую иметь под рукой.

А размерность типов зависит от архитектуры лишь косвенно.
Абсолютно размерность типов задает лишь конкретный компилятор. Вот в его хелпе и надо смотреть.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 7 2009, 15:43
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Kompot @ Jan 7 2009, 20:27) *
Абсолютно размерность типов задает лишь конкретный компилятор. Вот в его хелпе и надо смотреть.
Точнее в стандартном заголовочном файле limits.h
Go to the top of the page
 
+Quote Post
Kompot
сообщение Jan 8 2009, 13:42
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 10-06-08
Из: Хочу в пампасы...
Пользователь №: 38 192



Цитата(rezident @ Jan 7 2009, 18:43) *
Точнее в стандартном заголовочном файле limits.h


Точнее, в limits.h их можно посмотреть. Согласен. А вот определяются они исключительно компилятором.

Вот если я в строке
#define CHAR_BIT 8

напишу
#define CHAR_BIT 9
думаете, что-то изменится? (если макрос CHAR_BIT юзером нигде не использован).


Код
/*  limits.h

    Defines implementation specific limits on type values.

    Copyright (c) 1987, 1992 by Borland International
    All Rights Reserved.
*/

#ifndef __LIMITS_H
#define __LIMITS_H

#if !defined(___DEFS_H)
#include <_defs.h>
#endif

#define CHAR_BIT            8

#if ('\x80' < 0)
#define CHAR_MAX            127
#define CHAR_MIN            (-128)
#else
#define CHAR_MAX            255
#define CHAR_MIN            0
#endif

#define SCHAR_MAX           127
#define SCHAR_MIN           (-128)
#define UCHAR_MAX           255

#define SHRT_MAX            0x7FFF
#define SHRT_MIN            ((int)0x8000)
#define USHRT_MAX           0xFFFFU

#define INT_MAX             0x7FFF
#define INT_MIN             ((int)0x8000)
#define UINT_MAX            0xFFFFU

#define LONG_MAX            0x7FFFFFFFL
#define LONG_MIN            ((long)0x80000000L)
#define ULONG_MAX           0xFFFFFFFFUL

#define MB_LEN_MAX          1

#endif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01454 секунд с 7
ELECTRONIX ©2004-2016