2i
は、gcc
複素整数リテラルの拡張であり、の平方根の2倍の純粋な虚数です-1
。この拡張機能は、によってclang
もサポートされています。
でコンパイルgcc 5.4.0
すると、投稿されたアセンブリ出力が生成されるのは少し驚くべきことです。
- http://gcc.godbolt.org/#でコンパイルする
gcc
5.3.0からコンパイルエラーが発生しますhttp://gcc.godbolt.org/#
:: error: cannot convert '__complex__ int' to 'int' in return
。
- 投稿された関数のアセンブリコード
foo
が正しくありません0
。を返しません。複素整数定数2i
をに変換するとint
、実数部が返され0
ます。
逆に、clang
3.7では、警告なしにコンパイルされ、最適なコードが生成されますが、もちろん、期待したものではありません。
foo(int): # @foo(int)
xorl %eax, %eax
retq
この構文は、他のサフィックスと任意の順序で組み合わせることができます。以下のコードをでコンパイルすると、clang -Weverything
適切な警告が表示されますwarning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]
。
#include <stdio.h>
int main() {
printf("sizeof(2i) = %zd\n", sizeof(2i));
printf("sizeof(2ui) = %zd\n", sizeof(2ui));
printf("sizeof(2li) = %zd\n", sizeof(2li));
printf("sizeof(2lli) = %zd\n", sizeof(2lli));
printf("sizeof(2.i) = %zd\n", sizeof(2.i));
printf("sizeof(2.fi) = %zd\n", sizeof(2.fi));
printf("sizeof(2e0fi) = %zd\n", sizeof(2e0fi));
printf("sizeof(2e0i) = %zd\n", sizeof(2e0i));
printf("sizeof(2il) = %zd\n", sizeof(2il));
printf("sizeof(2ill) = %zd\n", sizeof(2ill));
printf("sizeof(2.if) = %zd\n", sizeof(2.if));
return 0;
}
それは私の環境でこの出力を生成します:
sizeof(2i) = 8
sizeof(2ui) = 8
sizeof(2li) = 16
sizeof(2lli) = 16
sizeof(2.i) = 16
sizeof(2.fi) = 8
sizeof(2e0fi) = 8
sizeof(2e0i) = 16
sizeof(2il) = 16
sizeof(2ill) = 16
sizeof(2.if) = 8
構文カラーリングエディタで最後のものを試してください ;-)