|
|
  |
Снова по преобразованию типов ) |
|
|
|
Jan 7 2009, 14:28
|
Участник

Группа: Участник
Сообщений: 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. - Правильно ли я понимаю, и увеличится ли объем программной памяти, если использовать описанное явное приведение по сравнению с первым вариантом?
--------------------
висячий монтаж -> лак - > ЦЛ - > ЛУТ - > ФР - > ? оу -> стабилизаторы - > драйверы -> микроконтроллеры - > ?
|
|
|
|
|
Jan 7 2009, 14:42
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(TeddyIn @ Jan 7 2009, 18:28)  Правильно ли я понимаю, и увеличится ли объем программной памяти, если использовать описанное явное приведение по сравнению с первым вариантом?  Мне это тоже мешает жить во многих случаях. Про объем можно не переживать, т.к. mul32 может ведь где-то еще использоваться, а про время выполнения... В общем, в любом случае, нужно явное приведение типов, но достаточно так: Код f = (unsigned long int)(a+b)*c*a/6556 А компиляторы - вон, EWAVR 5.20, "сообразил", что надо , остальные - нет. Пример для EWAVR vs WinAVR как раз из-за того, что там это из самых актуальных вопросов.
|
|
|
|
|
Jan 7 2009, 14:54
|
Участник

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

|
Цитата но достаточно так: Цитата Кстати, в последнем выражении количество явных приведений типа можно сократить. Спасибо, меньше писанины ) архитектура с51, компилятор Keil. Мдааа, а я то думал, что раз в книжке "програм-е МК на Си" написано, что char = 8bit, int = 16bit, long - 32... то так оно и есть, оказывается нужно еще и аритектуру учитывать
--------------------
висячий монтаж -> лак - > ЦЛ - > ЛУТ - > ФР - > ? оу -> стабилизаторы - > драйверы -> микроконтроллеры - > ?
|
|
|
|
|
Jan 7 2009, 15:05
|

.
     
Группа: Участник
Сообщений: 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, то Код f = ((a+b)*(unsigned long)c*a)/6556
|
|
|
|
|
Jan 7 2009, 15:16
|
Участник

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

|
Цитата 5 копеек по возможному ускорению Совершенству нет предела!
--------------------
висячий монтаж -> лак - > ЦЛ - > ЛУТ - > ФР - > ? оу -> стабилизаторы - > драйверы -> микроконтроллеры - > ?
|
|
|
|
|
Jan 7 2009, 15:27
|
Местный
  
Группа: Участник
Сообщений: 242
Регистрация: 10-06-08
Из: Хочу в пампасы...
Пользователь №: 38 192

|
Цитата(TeddyIn @ Jan 7 2009, 18:54)  Спасибо, меньше писанины ) архитектура с51, компилятор Keil. Мдааа, а я то думал, что раз в книжке "програм-е МК на Си" написано, что char = 8bit, int = 16bit, long - 32... то так оно и есть, оказывается нужно еще и аритектуру учитывать Доступнее всего об этом написано у Кернигана и Ричи. "Язык программирования Си". Настоятельно советую иметь под рукой. А размерность типов зависит от архитектуры лишь косвенно. Абсолютно размерность типов задает лишь конкретный компилятор. Вот в его хелпе и надо смотреть.
|
|
|
|
|
Jan 8 2009, 13:42
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|