2009-08-25 32 views
35

42 là int không dấu cũng được định nghĩa là "42U".Làm thế nào để viết một chữ viết tắt không rõ ràng?

unsigned int foo = 42U; // yeah! 

Làm thế nào tôi có thể viết "23" để nó là rõ ràng nó là một int unsigned short?

unsigned short bar = 23; // booh! not clear! 

EDIT sao cho ý nghĩa của câu hỏi là rõ ràng hơn:

template <class T> 
void doSomething(T) { 
    std::cout << "unknown type" << std::endl; 
} 

template<> 
void doSomething(unsigned int) { 
    std::cout << "unsigned int" << std::endl; 
} 

template<> 
void doSomething(unsigned short) { 
    std::cout << "unsigned short" << std::endl; 
} 

int main(int argc, char* argv[]) 
{ 
    doSomething(42U); 
    doSomething((unsigned short)23); // no other option than a cast? 

    return EXIT_SUCCESS; 
} 
+2

Khai báo một ' const unsigned ngắn 'đối tượng với một tên thích hợp và sau đó sử dụng nó thay cho 23. Nó vẫn không giúp bạn một cách rõ ràng rằng 23 được dự định để được unsigned ngắn, nhưng ít nhất bạn chỉ cần kiểm tra rằng tuyên bố để đảm bảo tính chính xác . Ở mọi nơi khác sẽ sử dụng hằng số và do đó ý nghĩa sẽ rõ ràng. –

+0

@Richard Corden: Nó được sử dụng hàng trăm lần như giá trị đầu vào và kết quả trong bài kiểm tra đơn vị, vì vậy ngắn hơn, tốt hơn ... U cho unsigned int là thuận tiện, nhưng (unsigned ngắn) phôi hoặc const unsigned đối tượng ngắn là bực bội . – moala

+0

Bạn đang hỏi cách khai báo một chữ viết tắt ngắn. Nếu bạn đã tìm kiếm câu hỏi đó, bạn sẽ tìm thấy câu trả lời của mình. Như đã nói bạn không thể. –

Trả lời

32

Bạn không thể. Chữ số không thể có loại short hoặc unsigned short.

Tất nhiên để gán cho bar, giá trị của chữ được chuyển đổi hoàn toàn thành unsigned short. Trong mã mẫu đầu tiên của bạn, bạn có thể làm cho chuyển đổi đó rõ ràng với dàn diễn viên, nhưng tôi nghĩ rằng điều đó khá rõ ràng đã xảy ra chuyển đổi nào. Việc truyền có khả năng tồi tệ hơn, vì với một số trình biên dịch nó sẽ dập tắt bất kỳ cảnh báo nào sẽ được đưa ra nếu giá trị bằng chữ nằm ngoài phạm vi của unsigned short. Sau đó, một lần nữa, nếu bạn muốn để sử dụng một giá trị như vậy vì một lý do chính đáng thì việc hủy các cảnh báo là tốt.

Trong ví dụ trong bản chỉnh sửa của bạn, nơi nó xảy ra là chức năng mẫu thay vì chức năng quá tải, bạn có thể thay thế cho dàn diễn viên: do_something<unsigned short>(23). Với chức năng bị quá tải, bạn vẫn có thể tránh một dàn diễn viên với:

void (*f)(unsigned short) = &do_something; 
f(23); 

... nhưng tôi không khuyên điều đó. Nếu không có gì khác, điều này chỉ hoạt động nếu phiên bản unsigned short thực sự tồn tại, trong khi cuộc gọi có dàn diễn viên thực hiện độ phân giải quá tải thông thường để tìm phiên bản tương thích nhất hiện có.

0

Thật không may, phương pháp duy nhất được xác định cho điều này là

Một hoặc hai nhân vật trong dấu nháy đơn ('), trước bởi chữ L

Theo http://cpp.comsci.us/etymology/literals.html

nào có nghĩa là bạn sẽ phải đại diện cho số của mình dưới dạng chuỗi thoát ASCII:

unsigned short bar = L'\x17'; 
+5

Chữ của bạn sẽ có loại 'wchar_t'. Nguồn bạn trích dẫn là sai. – avakar

+0

Cảm ơn bạn đã sửa. Tôi sẽ để lại câu trả lời này trong trường hợp bất cứ ai khác bị lừa bởi liên kết đó (mà đi lên trên một tìm kiếm google rõ ràng cho câu hỏi này), như tôi đã. –

+1

Nó có nhiều vấn đề hơn, chẳng hạn như giả định ASCII. 'A' không phải lúc nào cũng 65. – MSalters

0

Thật không may, họ không thể. Nhưng nếu mọi người chỉ nhìn hai từ phía sau số, họ nên thấy rõ ràng nó là một đoạn ngắn ... Nó không rõ ràng. Nhưng nó sẽ được tốt đẹp.

+0

Đó là mơ hồ nếu một phương pháp hoạt động khác nhau cho unsigned int và unsigned ngắn và nếu bạn vượt qua nó như doThings (42U) ;. Bất kỳ cách nào khác hơn doThings ((unsigned ngắn) 23)? – moala

0

Nếu bạn biểu thị số lượng dưới dạng số hex gồm 4 chữ số, độ ngắn chưa ký có thể rõ ràng hơn.

unsigned short bar = 0x0017;

+2

0x0017 dưới dạng một đoạn tắt chưa ký có thể rõ ràng cho người đọc, nhưng không phải cho trình biên dịch. – moala

8
unsigned short bar = (unsigned short) 23; 

hoặc nói chuyện mới ....

unsigned short bar = static_cast<unsigned short>(23); 
+2

Trong C, đây sẽ là điều đúng đắn để làm, nhưng các phôi kiểu C của IIRC được cau mày trong C++. – starblue

+3

cau mày! có lẽ tôi đã sửa đổi nó với một phiên bản cập nhật để giữ cho bạn hạnh phúc! – AnthonyLambert

1

Không có từ bổ nghĩa cho unsigned ngắn.Số nguyên, có loại int theo mặc định, thường được chuyển đổi hoàn toàn thành loại mục tiêu mà không gặp sự cố nào. Nhưng nếu bạn thực sự muốn một cách rõ ràng cho thấy loại, bạn có thể viết như sau:

unsigned short bar = static_cast<unsigned short>(23); 

Như tôi đã có thể thấy lý do duy nhất là sử dụng dấu hiệu đó cho thích hợp suy luận mẫu loại:

func(static_cast<unsigned short>(23)); 

Nhưng đối với trường hợp như vậy rõ ràng hơn sẽ được gọi như sau:

func<unsigned short>(23); 
0

Bạn có thể không nên sử dụng ngắn, trừ khi bạn có toàn bộ rất nhiều. Nó được thiết kế để sử dụng ít dung lượng hơn một int, nhưng int đó sẽ có "kích thước tự nhiên" cho kiến ​​trúc. Một cách hợp lý, nó có thể ngắn gọn. Tương tự như bitfields, điều này có nghĩa rằng quần short có thể được coi là một sự cân bằng không gian/thời gian. Điều đó thường chỉ đáng giá nếu nó mua cho bạn rất nhiều không gian. Mặc dù vậy, bạn không chắc có nhiều chữ trong ứng dụng của bạn, vì vậy không cần phải có các chữ viết ngắn. Usecases đơn giản là không trùng lặp.

2

ít nhất là trong Visual Studio (ít nhất là năm 2013 và mới hơn), bạn có thể viết

23ui16 

cho có được một hằng số kiểu unsigned ngắn.

xem định nghĩa của INT8_MIN, INT8_MAX, INT16_MIN, INT16_MAX vv macro trong stdint.h

Tôi không biết tại thời điểm cho dù đây là một phần của tiêu chuẩn C/C++

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