ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
4 мая
138009 Топик полностью
alcosar (09.11.2008 09:25, просмотров: 272) ответил ReAl на 4) не делает integer promotion, надо вручную приводить к int при работе с более узкими типами. Типичные плачи на электрониксе - "взял якобы рабочие исходники, а они не работают". А в тех исходниках
Поясните, пожалуйста, по integer promotion.  uint16_t foo(uint8_t i, uint8_t j) { return (i * j); } Здесь два однобайтных операнда дают двухбайтный результат
uint16_t foo(uint8_t i, uint8_t j)
{
  f6:	68 9f       	mul	r22, r24
  f8:	b0 01       	movw	r22, r0
  fa:	11 24       	eor	r1, r1
	return (i * j);
}
  fc:	cb 01       	movw	r24, r22
  fe:	08 95       	ret
А здесь возникает вопрос. Два двухбайтных операнда дают четырехбайтный результат. uint32_t foo(uint16_t i, uint16_t j) { return (i * j); } Почему в r24:r25 компилятор помещает нуль?
uint32_t foo(uint16_t i, uint16_t j)
{
  f6:	9c 01       	movw	r18, r24
  f8:	62 9f       	mul	r22, r18
  fa:	c0 01       	movw	r24, r0
  fc:	63 9f       	mul	r22, r19
  fe:	90 0d       	add	r25, r0
 100:	72 9f       	mul	r23, r18
 102:	90 0d       	add	r25, r0
 104:	11 24       	eor	r1, r1
	return (i * j);
}
 106:	bc 01       	movw	r22, r24
 108:	80 e0       	ldi	r24, 0x00	; 0
 10a:	90 e0       	ldi	r25, 0x00	; 0
 10c:	08 95       	ret