Tôi có chương trình sau. Tôi tự hỏi tại sao nó kết quả đầu ra -4 trên máy 64 bit sau đây? Giả định nào của tôi đã sai?c & gcc: Tăng trưởng và căn chỉnh ngăn xếp - đối với máy 64 bit
[Linux ubuntu 3.2.0-23-generiC# 36-Ubuntu SMP Tue 10 tháng 4 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux]
Trong trên máy và trình biên dịch gcc, theo mặc định b nên được đẩy đầu tiên và thứ hai. Ngăn xếp phát triển xuống dưới. Vì vậy, b nên có địa chỉ cao hơn và có địa chỉ thấp hơn. Vì vậy, kết quả nên được tích cực. Nhưng tôi có -4. Ai có thể giải thích điều này?
Đối số là hai ký tự chiếm 2 byte trong khung ngăn xếp. Nhưng tôi thấy sự khác biệt như 4 nơi như tôi mong đợi 1. Ngay cả khi ai đó nói đó là vì sự liên kết, sau đó tôi tự hỏi một cấu trúc với 2 ký tự không phải là liên kết tại 4 byte.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> void CompareAddress(char a, char b) { printf("Differs=%ld\n", (intptr_t)&b - (intptr_t)&a); } int main() { CompareAddress('a','b'); return 0; } /* Differs= -4 */
Trong trường hợp có ai quan tâm, để tiết kiệm phải làm theo thông qua các wikipedia trích dẫn, tài liệu AMD64 ABI chính thức có thể được tìm thấy ở đây: http://www.x86-64.org/documentation/abi.pdf –