Một điểm chưa được đề cập là tiêu chuẩn cho phép một cách rõ ràng cho khả năng rằng số nguyên đại diện có thể chứa các bit đệm. Cá nhân tôi muốn ủy ban tiêu chuẩn sẽ cho phép một cách dễ dàng tốt đẹp cho một chương trình để xác định hành vi mong đợi nhất định, và yêu cầu bất kỳ trình biên dịch phải tôn trọng các thông số kỹ thuật hoặc từ chối biên dịch; mã bắt đầu với thông số "số nguyên không được có bit đệm" sau đó sẽ có quyền giả định rằng đó là trường hợp.
Vì vậy, nó sẽ hoàn toàn hợp pháp (dù là lẻ) để triển khai lưu trữ giá trị 35 bit long
dưới dạng bốn ký tự 9 bit ở định dạng lớn, nhưng sử dụng LSB của byte đầu tiên bit. Trong quá trình thực hiện như vậy, việc lưu trữ 1
vào một long
có thể làm cho tính chẵn lẻ của từ tổng thể trở nên kỳ quặc, do đó hấp dẫn việc triển khai để lưu trữ một bit 1
vào bit chẵn lẻ. Để chắc chắn, hành vi đó sẽ là kỳ quặc, nhưng nếu kiến trúc sử dụng đệm là đủ đáng chú ý để biện minh cho các quy định rõ ràng trong tiêu chuẩn, mã sẽ phá vỡ trên các kiến trúc đó thực sự không thể được coi là "di động".
Mã sử dụng union
phải hoạt động chính xác trên tất cả các kiến trúc có thể được mô tả đơn giản là "người lớn" hoặc "nhỏ" và không sử dụng các bit đệm. Nó sẽ là vô nghĩa đối với một số kiến trúc khác (và thực sự là các thuật ngữ "big-endian" và "little-endian" cũng có thể vô nghĩa).
Tôi tin rằng việc truyền con trỏ lông là hành vi không xác định về mặt kỹ thuật, nhưng tôi không thể trích dẫn bất cứ điều gì, và nó chắc chắn sẽ hoạt động trên hầu hết các máy. –
Tôi sẽ ngạc nhiên nếu nó không được xác định; nếu không làm thế nào memcpy và mã serialization nhất làm việc? – Crashworks
@ Chris Tôi tin rằng bạn đã đảo ngược.Chuyển đổi từ một 'char *' thành 'int *' có thể gây ra hành vi không xác định. Tôi có một bản sao của dự thảo WG14/N1124 và nếu mọi thứ không thay đổi kể từ đó: * Khi một con trỏ tới một đối tượng được chuyển đổi thành con trỏ thành kiểu ký tự, kết quả sẽ trỏ đến byte địa chỉ thấp nhất là đối tượng. * (p.47, http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1124.pdf) –