2ies una gccextensión de un literal entero complejo, un número imaginario puro dos veces la raíz cuadrada de -1. Esta extensión también es compatible con clang.
Es algo sorprendente que su compilación gcc 5.4.0produzca el resultado del ensamblado publicado:
- Compilando en http://gcc.godbolt.org/# Recibo un error de compilación de
gcc5.3.0 http://gcc.godbolt.org/#:: error: cannot convert '__complex__ int' to 'int' in return.
- El código de ensamblaje publicado para la función
fooes incorrecto: no regresa 0. La conversión de la constante entera compleja 2ien intdebería devolver su parte real 0.
Por el contrario, con clang3.7, se compila sin una advertencia y genera un código óptimo, pero por supuesto no es lo que esperas:
foo(int): # @foo(int)
xorl %eax, %eax
retq
Esta sintaxis se puede combinar con otros sufijos en cualquier orden. Compilar el código a continuación con clang -Weverythingme da las advertencias adecuadas 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;
}
Produce esta salida en mi entorno:
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
Prueba el último con tu editor de colores de sintaxis ;-)