2016-02-03 17 views
5

Các quy tắc được sử dụng bởi C++ để xác định loại biểu thức số học liên quan đến hai loại số nguyên khác nhau là gì?Quy tắc chuyển đổi số nguyên C++

Nói chung, thật dễ dàng để tìm ra kết quả, tuy nhiên tôi đã gặp các trường hợp với các ký tự int/unsigned bị nhầm lẫn.

Ví dụ: cả hai bên dưới đều là unsigned int trong VS.

unsigned int us = 0; 
int s = 1; 

auto result0 = us - s; // unsigned int 
auto result1 = s - us; // unsigned int 

Điều này có giống với các trình biên dịch khác không? Có quy tắc cụ thể nào để xác định loại không?

+2

Bạn đã đọc [tài liệu] (http://en.cppreference.com/w/cpp/language/auto) chưa? – NathanOliver

+0

Các quy tắc cũng giống như đối với loại khấu trừ mẫu, ngoại trừ trong trường hợp 'auto x {expr};'/'auto x = {expr};'. – Michael

+6

Điều này gần như có vẻ giống như một câu hỏi về loại hình khuyến mãi sau đó tự động khấu trừ. – NathanOliver

Trả lời

5

Tất cả đều được xác định rõ.

1đã ký chữ. Trên thực tế, nếu bạn muốn nó unsigned, bạn cần phải sử dụng ký hiệu thập lục phân hoặc bát phân, một hậu tố thích hợp (ví dụ: u) hoặc một diễn viên.

Nếu một thao tác số học được gặp mà có một signed int và một unsigned int như các đối số, sau đó các signed intchuyển đến một loại unsigned int.

+0

Tất cả các chi tiết của chuyển đổi tích phân phụ thuộc vào loại đích, nhưng khi đây là tự động thì nó không xác định? –

+2

"Tất cả các chi tiết của chuyển đổi tích phân phụ thuộc vào loại đích". Hoàn toàn là ** không bao giờ ** trường hợp. – Bathsheba

+0

http://en.cppreference.com/w/cpp/language/implicit_cast#Integral_conversions –

0

Dưới đây là một câu trả lời rought ngắn, tôi hy vọng nó rất hữu ích mặc dù nó không bao gồm tất cả mọi thứ và thậm chí có thể là một sự đơn giản hóa:

  1. Literals được ký trừ khi quy định như 'U'.

  2. Trong một biểu thức tách rời liên quan đến các loại khác nhau, các loại số nguyên nhỏ hơn được thăng (thành int nếu tất cả các loại có liên quan phù hợp với int, nếu không quảng bá cho int không dấu), vì vậy khi giá trị chưa ký và giá trị đã ký, ví dụ: được thêm vào, giá trị đã ký là 'được quảng bá' thành int không dấu nếu biến chưa ký có cùng chiều rộng bit như một int. Vì vậy, một unsigned int được coi bởi trình biên dịch là 'lớn hơn' so với int đã đăng ký trong các quy tắc khuyến mãi, ngay cả khi trong thời gian chạy các giá trị thực được lưu trữ trong các biến sẽ dễ dàng phù hợp với một đại diện đã ký cùng số bit.

  3. Cũng lưu ý rằng 'char' có thể có nghĩa là unsigned char, trong khi 'int' luôn có nghĩa là int.

+0

3. Không phải toàn bộ câu chuyện, char, unsigned char và ký char là 3 loại riêng biệt. Chuẩn C đảm bảo rằng tất cả các thành viên của bộ ký tự thực thi cơ bản đều có giá trị không âm. Chỉnh sửa câu trả lời. –

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