5

Hãy nói rằng tôi đã sau struct:Các trường bit có ít hơn int có phải là chủ đề của quảng cáo không tách rời?

struct A 
{ 
    unsigned int a : 1; 
    unsigned int b : 1; 
}; 

gì tôi quan tâm là loại biểu a + b. Trong khi các trường bit về mặt kỹ thuật có "loại" có kích thước nhỏ hơn int để quảng bá tích phân có thể xảy ra và kết quả là int giống như nó xảy ra trong gcc và clang.

Nhưng vì không thể trích xuất chính xác loại trường bit và nó sẽ luôn được suy ra là loại "lớn" (tức là unsigned int trong trường hợp này) có đúng không? Bởi vì chúng ta không thể thực sự nói về các loại chính xác và kích thước của chúng cho các trường bit, ngoại trừ chúng được suy ra như là unsigned int, trong trường hợp này, việc thúc đẩy tích phân không nên xảy ra.

(Một lần nữa câu hỏi của tôi bắt nguồn từ thực tế là MSVC xảy ra khi nghĩ rằng unsigned int là loại biểu hiện như vậy)

+0

Phiên bản studio trực quan nào, có thể có ý nghĩa khi thêm thẻ đó trong trường hợp những người khác có cùng vấn đề –

+0

@ShafikYaghmour Đó là phiên bản mới nhất nhưng tôi đã thêm nó vào trường hợp. – Predelnik

+0

Cũng có liên quan: [Tại sao một đoạn mã ngắn phải được chuyển thành một int trước khi phép toán số học trong C và C++?] (Http://stackoverflow.com/q/24371868/1708801) –

Trả lời

4

Nếu chúng ta đi đến phần draft C++ standard: N41405 nó nói:

Nhiều nhà khai thác nhị phân mong đợi toán hạng của số học hoặc loại liệt kê gây ra chuyển đổi và loại kết quả lợi nhuận theo cách tương tự . Mục đích là tạo ra một loại phổ biến, cũng là loại kết quả là . Mô hình này được gọi là chuyển đổi số học thông thường, được định nghĩa như sau

và viên đạn sau đây áp dụng:

  • Nếu không, các chương trình khuyến mãi không thể thiếu (4.5) phải được thực hiện trên cả hai toán hạng. 61 sau đó, các quy tắc sau đây được áp dụng cho các đề bạt toán hạng:

và phái ion 4.5 mà nói (tôi nhấn mạnh):

Một prvalue cho một bit lĩnh vực không thể thiếu (9.6) có thể được chuyển đổi sang một prvalue của kiểu int nếu int có thể đại diện cho tất cả các giá trị của các bit -cánh đồng; nếu không, nó có thể được chuyển đổi sang unsigned int nếu unsigned int có thể đại diện cho tất cả các giá trị của bit-field. Nếu trường bit là lớn hơn, không có khuyến mại tích hợp nào áp dụng cho trường đó. Nếu trường bit có một loại được liệt kê, nó được coi là bất kỳ giá trị nào khác của loại đó cho mục đích quảng cáo .

Vì vậy, gcc và tiếng kêu là chính xác, ab phải được thăng cấp thành int.

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