2i
là gcc
phần mở rộng cho một chữ số nguyên phức, một số thuần ảo gấp đôi căn bậc hai của -1
. Phần mở rộng này cũng được hỗ trợ bởi clang
.
Điều hơi ngạc nhiên là quá trình biên dịch của bạn với gcc 5.4.0
tạo ra kết quả lắp ráp đã đăng:
- Biên dịch trên http://gcc.godbolt.org/# Tôi gặp lỗi biên dịch từ
gcc
5.3.0 http://gcc.godbolt.org/#
:: error: cannot convert '__complex__ int' to 'int' in return
.
- Mã lắp ráp đã đăng cho chức năng
foo
không chính xác: nó không trả về 0
. Chuyển đổi hằng số nguyên phức 2i
thành int
sẽ trả về phần thực của nó 0
.
Ngược lại, với clang
3.7, nó biên dịch mà không có cảnh báo và tạo ra mã tối ưu, nhưng tất nhiên không phải những gì bạn mong đợi:
foo(int): # @foo(int)
xorl %eax, %eax
retq
Cú pháp này có thể được kết hợp với các hậu tố khác theo bất kỳ thứ tự nào. Việc biên dịch mã bên dưới với clang -Weverything
các cảnh báo thích hợp cho tôi 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;
}
Nó tạo ra đầu ra này trong môi trường của tôi:
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
Hãy thử cái cuối cùng với trình chỉnh sửa màu cú pháp của bạn ;-)