0

在打开警告的桌面上使用 GCC -Wconversion,很明显s 在使用数字文字的数学运算期间short被提升为s:int

unsigned short i = 10; // Obviously truncates to short immediately
unsigned short j = 30; // Same here

i = j + 2; // Warnings imply j gets promoted to int here, demands cast

在 ARM 目标上,规则是“短裤总是更快”,在几乎所有数学运算(尤其包括文字)期间,它们被提升为ints 进行运算是否仍然正确?

short如果是这样,除了让编译器帮助您检查边界是否合理之外,还有什么理由使用s 吗?我没有处理大量的短裤,所以存储空间似乎不是问题(或者是吗?)。

注意。这是音频处理,所以我不是为了它而优化,确实需要考虑这一点。

4

3 回答 3

4

在 ARM 目标上,规则是“短裤总是更快”,在几乎所有数学运算(特别是包括文字)期间,它们被提升为整数以进行运算仍然是真的吗?

对于大多数运算符,由于整数提升规则,short操作数会被提升。int

例如

i = j + 2;  // j is promoted to int because of integer promotion

但是也

i = i + j; // i and j are promoted to int in the + expression 

在 ARM 目标上,规则是“短裤总是更快”

在 ARM 上,short16-bit 但 ARM 字长是32-bit,所以这个说法是错误的。 short或者char需要签名扩展或零扩展并且速度较慢。 short可用于节省内存但用于性能intlong更快。

于 2013-07-24T11:19:37.640 回答
2

形式上,该语言要求类型比在大多数算术运算之前int提升(到int或)更窄。unsigned int这意味着在您的示例中,j将提升为int,在 an 中执行加法,并通过赋值int将结果转换回。short

但是,如果编译器不会改变程序的可观察行为,则编译器可以自由地省略这些转换。由于这种情况下的结果被转换回short,这适用于这里 - 编译器可以发出直接执行short大小加法的指令,这是合法的。如果这会在目标平台上执行得更快,您可以预期clang会这样做。

于 2013-07-24T14:10:45.267 回答
2

Arithmetic operators do not accept types smaller than int as arguments.

于 2013-07-24T11:26:34.007 回答