2012-01-29 24 views
12

Tôi đọc rằng người ta có thể sử dụng "char" cho số nguyên nhỏ. Tuy nhiên, khi tôi cố gắng,Sử dụng char cho số nguyên nhỏ (C++)

unsigned char A = 4; 
std::cout << A << std::endl; 

nó mang lại cho một nhân vật, chứ không phải 4.

+1

bạn đã đọc nội dung đó ở đâu? anyways, nó phải được unsigned chat A = '4'; và nó sẽ được lưu trữ dưới dạng một ký tự không phải là số nguyên – krammer

+6

Char được sử dụng ngầm làm ký tự, để ngăn diễn viên này thành int: 'std :: cout << (int) Một << std :: endl;' – Nobody

+3

@krammer: it phụ thuộc vào những gì anh ta muốn và bạn có nghĩa là char không chat, phải không? – Burkhard

Trả lời

17

những ảnh hưởng của điều hành quá tải gì bạn đang trải qua là. Nhà điều hành <<giả định mà bạn rất có thể muốn in một ký tự khi bạn đặt biến số char, do đó, nó hoạt động khác với bạn mong đợi nó cho các biến tích phân.

Theo đề nghị của Vivek Goel bạn có thể buộc các trình biên dịch để chọn quá tải bạn thực sự muốn:

unsigned char A = 4; 
std::cout << static_cast<unsigned int>(A) << std::endl; 

Phụ Lục: Trừ khi bạn đang làm việc trên một môi trường với nguồn lực hạn chế nghiêm trọng (. Đặc biệt là bộ nhớ nhỏ) , bạn đang tối ưu hóa kết thúc sai. Các hoạt động trên unsigned int thường nhanh hơn trên unsigned char, bởi vì bộ xử lý của bạn không thể tìm nạp các byte đơn lẻ nhưng phải lấy ít nhất một bội số của 4 và loại bỏ 3 byte khác.

4

Nó phải là

unsigned char A = 4; 
    std::cout << (int)A << std::endl; 
4

Một char IS một số nguyên nhỏ (có dải từ -127 đến +127) và nó phải chịu cùng số học số nguyên như số nguyên. Vấn đề ở đây là sự kết hợp khái niệm giữa biểu diễn bên trong (số nhị phân đại diện cho dải từ -127 đến +127) với một bên ngoài, thông thường làm cho các hàm đầu vào và đầu ra biểu diễn nó như là " glyph có mã ASCII là số do nó ", trong khi đối với số nguyên, biểu diễn bên ngoài là" chuỗi ký tự được đọc giống như số nguyên được biểu diễn dưới dạng thập phân "

Cách đơn giản nhất để in dưới dạng số, là chuyển đổi nó thành int ngay trước khi cung cấp cho hàm đầu ra (như cout << int(ch) hoặc bất kỳ hình thức chuyển đổi tương đương nào)

6

Có một quá tải của operator<< cho std::ostream và (signed/unsigned) char thực hiện đầu ra ký tự; để ra giá trị số nguyên của nhân vật, bạn cần phải thực hiện một dàn diễn viên:

std::cout << (int)A << std::endl; 

Tuy nhiên, đây là những gì được gọi là một “kiểu cũ” (cụ thể hơn C-style) đúc. C++ đã đúc nhà khai thác đó là rõ ràng hơn, dễ dàng hơn để tìm kiếm, và thường ưa thích:

std::cout << static_cast<int>(A) << std::endl; 

Nhưng đây là rườm rà để gõ; thay thế thành ngữ là sử dụng + điều hành, trong đó khuyến khích đối số của nó để (unsigned) int:

std::cout << +A << std::endl; 

Đây là những gì bạn nên sử dụng.

+1

+1 cho quảng cáo '+ A' – bitmask

1

Đối với các đối tượng đơn lẻ, việc tăng kích thước mã có thể làm giảm kích thước bộ nhớ của bất kỳ bộ nhớ nào (bộ nhớ theo đối tượng có thể cần cho đệm căn chỉnh). Sử dụng int trừ khi bạn cần một mảng lớn các số nguyên nhỏ.

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