В целом, не обязательно конкретный для этого процессора, он имеет отношение к расширению знака и маскировке, требуя дополнительных инструкций для правильного внедрения исходного кода на C. Подписанное 8-битное значение в процессоре 16 или 32 или 64 бит МОЖЕТ включать дополнительные инструкции для подписи расширения. 8-битная добавка на 32-битном процессоре может включать дополнительные инструкции и с 0xFF и т. Д.
Вам нужно сделать несколько простых экспериментов, потребовалось несколько итераций, но я быстро ударил то, что показало разницу.
unsigned int fun (unsigned int a, unsigned int b)
{
return(a+b)<<3;
}
unsigned char bfun (unsigned char a, unsigned char b)
{
return(a+b)<<3;
}
int sfun ( int a, int b)
{
return(a+b)<<3;
}
char sbfun ( char a, char b)
{
return(a+b)<<3;
}
производит
00000000 <fun>:
0: 0f 5e add r14, r15
2: 0f 5f rla r15
4: 0f 5f rla r15
6: 0f 5f rla r15
8: 30 41 ret
0000000a <bfun>:
a: 4f 5e add.b r14, r15
c: 4f 5f rla.b r15
e: 4f 5f rla.b r15
10: 4f 5f rla.b r15
12: 30 41 ret
00000014 <sfun>:
14: 0f 5e add r14, r15
16: 0f 5f rla r15
18: 0f 5f rla r15
1a: 0f 5f rla r15
1c: 30 41 ret
0000001e <sbfun>:
1e: 8f 11 sxt r15
20: 8e 11 sxt r14
22: 0f 5e add r14, r15
24: 0f 5f rla r15
26: 0f 5f rla r15
28: 0f 5f rla r15
2a: 4f 4f mov.b r15, r15
2c: 30 41 ret
микроконтроллера MSP430 имеет слово и байты версию инструкции, простые добавить или вычесть оленью кожу должно сделать вырезку или подписать расширение, которое можно было бы ожидать при использовании меньшим, чем зарегистрировать размер переменные. Как программист, мы могли бы знать, что мы будем только кормить sbfun очень маленькими числами, но компилятор не имеет и должен добросовестно реализовывать наш код, как написано, генерируя больше кода между sfun и sbfun. Нетрудно сделать эти эксперименты с разными компиляторами и процессорами, чтобы увидеть это в действии, единственный трюк заключается в том, чтобы создать код, который процессор не имеет простых инструкций для решения.
другой пример
unsigned int fun (unsigned int a, unsigned int b)
{
return(a+b)>>1;
}
unsigned char bfun (unsigned char a, unsigned char b)
{
return(a+b)>>1;
}
производит
00000000 <fun>:
0: 0f 5e add r14, r15
2: 12 c3 clrc
4: 0f 10 rrc r15
6: 30 41 ret
00000008 <bfun>:
8: 4f 4f mov.b r15, r15
a: 4e 4e mov.b r14, r14
c: 0f 5e add r14, r15
e: 0f 11 rra r15
10: 4f 4f mov.b r15, r15
12: 30 41 ret
AFAIK MSP430 не имеет никакого значения задержки в инструкции между 8-битовые и 16-битовые операнды. Мне тоже любопытно. –
Я хотел бы добавить, что замечательная вещь, которую я люблю о '(u) int_ (fast | minimum) (8 | 16 | 32) _t', заключается в том, что вы можете указать, какую оптимизацию вы хотите, и, как правило, разрешить обработчик компилятора Это. Если вы хотите использовать как можно меньше места и вам нужно представить до 20 000, используйте '(u) int_least16_t', но если вы используете что-то для тяжелых вычислений, которое вы хотите быстро, вы можете использовать' (u) int_fast16_t' в значительной степени без необходимости беспокоиться о том, какой тип он использует, используя под капотом. – rjp