Bao nhiêu byte là dài không dấu dài?


81

Là bao nhiêu byte unsigned long long? Nó có giống với unsigned long long int?


51
Làm sizeof (dài dài không dấu).
The Community Duck

2
Có liên quan, đại loại. stackoverflow.com/questions/4329777/…
John Dibling

2
Các tiêu chuẩn C và C ++ nên áp dụng những thứ có số bên trong chúng, để ghi đè cách trình biên dịch tự động chọn. Một cái gì đó như float32, float64, int32, vv lên đến bất kỳ hạn chế chúng ta cần, những gì về int256 hoặc float1024 ... điều này sẽ thực sự loại bỏ cơn đau ...?
jokoon

2
@gokoon: như tôi đã giải thích trong câu trả lời của tôi, tiêu chuẩn C đã có int32_t, uint64_tvv C ++ sẽ nhận được chúng với các tiêu chuẩn sắp tới. Chúng ở trong tiêu đề <stdint.h>.
Fred Foo

1
những gì về float và double?
jokoon

Câu trả lời:


79

Tóm tắt: nó là 64 bit hoặc lớn hơn.

unsigned long longgiống như unsigned long long int. Kích thước của nó phụ thuộc vào nền tảng, nhưng được đảm bảo theo tiêu chuẩn C (ISO C99) là ít nhất 64 bit. Không có long longtrong C89, nhưng dường như ngay cả MSVC cũng hỗ trợ nó, vì vậy nó khá di động.

Trong tiêu chuẩn C ++ hiện tại (ban hành năm 2003), không có long long, mặc dù nhiều trình biên dịch hỗ trợ nó như một phần mở rộng. Chuẩn C ++ 0x sắp tới sẽ hỗ trợ nó và kích thước của nó sẽ giống như trong C, vì vậy ít nhất là 64 bit.

Bạn có thể nhận được kích thước chính xác, tính bằng byte (8 bit trên các nền tảng điển hình) với biểu thức sizeof(unsigned long long). Nếu bạn muốn chính xác 64 bit, hãy sử dụng uint64_t, được định nghĩa trong tiêu đề <stdint.h>cùng với một loạt các kiểu liên quan (có sẵn trong C99, C ++ 11 và một số trình biên dịch C ++ hiện tại).


2
@lars: sizeof(char) được đảm bảo trả lại chính xác một . Nó trả về độ lớn của toán hạng theo số byte, không phải số "đơn vị ký tự". Do đó, không phải byte của nó "trên hầu hết các nền tảng" byte của nó trên mọi nền tảng.
John Dibling

1
@John: điều đó phụ thuộc vào định nghĩa của byte . Nếu bạn đánh đồng charvà byte, bạn đúng. Nếu bạn cân bằng charoctet , thì nó thay đổi.
Fred Foo

4
@lars: Không, không. Một ký tự luôn chính xác là một byte trên mọi nền tảng. Tiêu chuẩn không chỉ định có bao nhiêu bit trong một byte, nhưng đó là một điều khác. Việc triển khai có thể sử dụng 64 bit byte, điều này sẽ dẫn đến sizeof(long long) == 1và điều đó sẽ tuân theo.
John Dibling

1
@lars: Dù sao thì tôi cũng đã ủng hộ bạn, nhưng đây là một nitpick: "được đảm bảo bởi tiêu chuẩn C (ISO C99) là ít nhất 64 bit == 8 byte" Tôi không thể tưởng tượng một thế giới không nhúng trong đó 64 bit! = 8 byte, nhưng Tiêu chuẩn không đảm bảo điều đó.
John Dibling

@John: lại đúng. Đã xóa 64 bit == 8 byte vì tôi đang ở chế độ luật sư ngôn ngữ. Và tôi đã nghe nói rằng thực sự có những nền tảng nhúng trong đó một byte là 16 bit.
Fred Foo

17

Vẻ đẹp của C ++, giống như C, là kích thước của những thứ này được xác định bởi việc triển khai, vì vậy không có câu trả lời chính xác nếu bạn không chỉ định trình biên dịch mà bạn đang sử dụng. Hai cái đó có giống nhau không? Đúng. "long long" là một từ đồng nghĩa với "long long int", đối với bất kỳ trình biên dịch nào chấp nhận cả hai.


57
Vẻ đẹp hay lời nguyền?
Michael Burr

2
Mặc dù những gì bạn nói là đúng về mặt kỹ thuật, nhưng tiêu chuẩn yêu cầu độ dài đó phải dài ít nhất 64 bit và tôi không biết về bất kỳ triển khai nào xác định bất kỳ kích thước nào khác ngoài 64 bit. Điều đó có thể thay đổi khi các trình biên dịch 128-bit ra mắt, nhưng đối với các trình biên dịch hiện tại, nó không phải là một đoạn dài để giả định 64 bit.
Boaz Yaniv

2
+1, chống lại sự phản đối. Câu trả lời phụ thuộc vào ý nghĩa của 'là'.
Andy Finkenstadt

3
@Andy: Bill Clinton? Đó là bạn? ;)
John Dibling

4
Đây là hoàn toàn không phải là "Vẻ đẹp của C ++", đó là một nỗi đau hoàn chỉnh: p
asimes

14

Nó phải có ít nhất 64 bit. Khác với việc thực hiện nó được xác định.

Nói chính xác, unsigned long longkhông phải là tiêu chuẩn trong C ++ cho đến khi tiêu chuẩn C ++ 0x. unsigned long longlà 'đơn vị định dạng đơn giản' cho loại unsigned long long int(vì vậy chúng là từ đồng nghĩa).

Tập long longhợp các kiểu cũng nằm trong C99 và là một phần mở rộng phổ biến cho các trình biên dịch C ++ ngay cả trước khi được chuẩn hóa.


1
"Gần đây được phê chuẩn?" Thời gian qua tôi đã kiểm tra họ đang xem xét hoãn nó đến 2012.
Fred Foo


1
@In silico: Tôi đọc đó. Tôi cũng đã đọc ở đâu đó về sự chậm trễ có thể xảy ra, nhưng thực sự tôi không thể nhớ được là ở đâu.
Fred Foo

1
@larsmans: Trừ khi tôi thấy nguồn chính thức về việc FDIS bị trì hoãn (truy vấn của công cụ tìm kiếm cho "C ++ 0x FDIS delay" cho tôi không có lần truy cập liên quan nào), tôi hoàn toàn mong đợi tiêu chuẩn sẽ được xuất bản vào năm 2011, các vấn đề nghiêm trọng trong mặc dù tiêu chuẩn của chính nó.
Trong silico

1
@In silico: Tôi cũng không tìm thấy tài liệu tham khảo, vì vậy tôi đoán đó là tin đồn hoặc sự hiểu lầm từ phía tôi. Tuy nhiên, tôi không nghĩ tình trạng FDIS giống như việc phê chuẩn đầy đủ, phải không?
Fred Foo

3

Sử dụng toán tử sizeof, nó sẽ cung cấp cho bạn kích thước của một kiểu được biểu thị bằng byte. Một byte là tám bit. Xem chương trình sau:

#include <iostream>

int main(int,char**)
{
 std::cout << "unsigned long long " << sizeof(unsigned long long) << "\n";
 std::cout << "unsigned long long int " << sizeof(unsigned long long int) << "\n";
 return 0;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.