2011-12-27 72 views
32

Chuẩn C (ISO/IEC 9899: 2011 hoặc 9899: 1999) xác định loại ptrdiff_t trong <stddef.h>.Sự khác nhau giữa ssize_t và ptrdiff_t là gì?

Chuẩn POSIX (ISO/IEC 9945; IEEE Std 1003.1-2008) xác định loại ssize_t trong <sys/types.h>.

  • Sự khác nhau giữa các loại này (hoặc tại sao cả hai được coi là cần thiết)?
  • Có triển khai nào trong đó loại cơ sở cơ bản cho ssize_t không giống với ptrdiff_t?
+3

có lẽ đó là ngữ nghĩa của 'ptrdiff_t' được gọi để bổ sung' ssize_t'? Đôi khi, một loại kích thước có chữ ký là hữu ích, nếu bạn muốn có thể trung gian có nó đại diện cho '-1'. Ngữ nghĩa của 'ptrdiff_t' là" sự khác biệt giữa hai con trỏ ", đó không phải là ngữ nghĩa chính xác của" kích thước ". –

+1

Có lẽ một chút hoang tưởng NIH trong ủy ban stadards có liên quan –

Trả lời

22

Có một thực hiện nơi các loại cơ sở cơ bản cho ssize_t không giống như đối với ptrdiff_t?

x86-16 bằng mô hình bộ nhớ lớn. Con trỏ ở xa (32 bit), nhưng các đối tượng riêng lẻ được giới hạn ở một phân đoạn (vì vậy size_t được phép là 16 bit).

+9

sẽ không 'ptrdiff_t' cũng là 16 bit trong tình huống đó, vì sự khác biệt con trỏ chỉ được xác định khi cả hai con trỏ trỏ vào cùng một đối tượng ... –

+4

@Dhris:' ptrdiff_t 'là một kiểu được định nghĩa thực hiện, và làm cho nó có kích thước của một con trỏ có vẻ hợp lý. Các thao tác trên con trỏ được cho là không đáng ngạc nhiên đối với bất kỳ ai quen thuộc với mô hình bộ nhớ, và một 16-bit 'ptrdiff_t' có khả năng sẽ làm mọi người ngạc nhiên khi sử dụng con trỏ 32 bit. –

+7

@ChrisDodd: Một đối tượng có thể lên tới 65535 byte, vì vậy phép trừ con trỏ hợp lệ có thể dễ dàng vượt quá 32767; cho 'ptrdiff_t', bạn muốn có một kiểu đã ký có thể chứa các giá trị lên đến 65536. –

18

The Open Group Cơ sở kỹ thuật Issue 7, IEEE Std 1003.1 2013 Edition, mô tả về <sys/types.h> nói:

Loại ssize_t có khả năng lưu trữ các giá trị ít nhất là trong khoảng [-1, SSIZE_MAX].

Nói cách khác, ssize_t được ký kết, nhưng tập các giá trị tiêu cực nó có thể đại diện có thể được giới hạn chỉ {-1}.

A ptrdiff_t, mặt khác, được đảm bảo có phạm vi tích cực/âm đối xứng hơn.

Tôi thừa nhận rằng trên thực tế, dường như không có khả năng là ssize_t sẽ bị giới hạn trong phạm vi phủ định, nhưng điều đó là có thể.

Tất nhiên, một khác biệt là ptrdiff_t khả dụng bất cứ khi nào bạn lập trình chuẩn C hoặc C++, nhưng ssize_t có thể không khả dụng trừ khi bạn đang nhắm mục tiêu hệ thống POSIX chuẩn.

+0

Cảm ơn thông tin lịch sử; nó giúp giải thích nó đến từ đâu, ngay cả khi tiêu chuẩn hiện tại không còn ủy thác phạm vi. (Tìm kiếm của tôi về tiêu chuẩn hiện tại không phải là những gì tôi coi là dứt khoát, mặc dù tôi tin rằng nó khá kỹ lưỡng; vì thế 'từ chồn' của 'dường như không nằm trong tiêu chuẩn năm 2008'.) –

+0

I wasn ' t quen thuộc với 'ssize_t' trước ngày hôm nay. Tôi đã chỉ ra những gì tôi đã học được từ kết quả tìm kiếm hàng đầu. –

+2

[2008 'sys/types.h' standard] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html) có cùng yêu cầu' [-1, {SSIZE_MAX}] 'cho 'ssize_t'. – jw013

Các vấn đề liên quan