2011-07-02 37 views
7
main() 
{ 
    unsigned x=1; 
    char y=-1; 

    if(x>y) 
      printf("x>y"); 
    else 
     printf("x<=y"); 
} 

Tôi mong đợi x> y. nhưng khi tôi thay đổi int unsigned int int, tôi đã nhận được kết quả mong đợi.Tại sao một số không dấu int 1 thấp hơn char y -1?

+0

char y = -1; nó nên ném một lỗi tôi nghĩ rằng nó nên được char y = '- 1' thay vì – Devjosh

+0

@ Devjosh, không có bạn là sai. '-1' không phải là ký tự hợp lệ. – taskinoor

+0

@Devjosh: ''-1'' ném cảnh báo vì nó thực sự là'' -'' và ''1'' kết hợp, không phải là số" -1 ". Cái sau bị bỏ qua. – Lekensteyn

Trả lời

11

Nếu char tương đương với signed char:

  • char được thăng int (Khuyến mãi Integer, ISO C99 §6.3.1.1 ¶2)
  • Kể từ intunsigned có cùng giá trị, int được chuyển đổi đến unsigned (Chuyển đổi số học, ISO C99 §6.3.1.8)

Nếu char tương đương với unsigned char:

  • char có thể được thăng chức hoặc int hay unsigned int:
    • Nếu int thể đại diện cho tất cả unsigned char giá trị (thường là vì sizeof(int) > sizeof(char)), char được chuyển thành int.
    • Nếu không (thường là vì sizeof(char)==sizeof(int)), char được chuyển thành unsigned.
  • Bây giờ chúng tôi có một toán hạng là int hoặc unsigned và một số khác là unsigned. Toán hạng đầu tiên được chuyển đổi thành unsigned.

chương trình khuyến mãi Integer: Một biểu hiện của một loại cấp bậc thấp hơn int được chuyển thành int nếu int có thể chứa tất cả các giá trị của các loại gốc, để unsigned khác.

Chuyển đổi số học: Cố gắng chuyển đổi thành loại lớn hơn. Khi có xung đột giữa đã ký và chưa ký, nếu trường hợp lớn hơn (bao gồm cả trường hợp có hai loại có cùng thứ hạng) thì không được ký, hãy đi với unsigned. Nếu không, đi với ký chỉ trong trường hợp nó có thể đại diện cho tất cả các giá trị của cả hai loại.

Chuyển đổi để nguyên loại (ISO C99 §6.3.1.3):

chuyển đổi của một giá trị out-of-phạm vi để một kiểu dữ liệu integer unsigned được thực hiện thông qua bọc xung quanh (số học modula).

Việc chuyển đổi giá trị ngoài phạm vi sang loại số nguyên đã ký được thực hiện được xác định và có thể tăng tín hiệu (chẳng hạn như SIGFPE).

+0

Đã chỉnh sửa: mất trí nhớ do thiếu ngủ. – ninjalj

+1

+1 câu trả lời chi tiết và chính xác. (Và bởi vì tôi hầu như luôn luôn +1 câu trả lời đúng chính xác khi câu trả lời được chấp nhận là sai.) –

4

Khi sử dụng ký tên và chưa ký trong hoạt động đơn lẻ, chữ ký đã được thăng hạng không được ký hiệu bằng chuyển đổi loại tự động của C. Nếu patter bit của -1 được coi là một số unsigned sau đó nó là một giá trị rất rất cao. Vì vậy, x > y là sai.

+1

@taskinoor: Không quan trọng mẫu bit -1 là "được coi là số không dấu", đó là _value_ quan trọng khi nó được chuyển thành kiểu không dấu. –

+0

@Charles Bailey, đó là ý của tôi. Có thể ngôn ngữ của tôi không đủ tốt. – taskinoor

+3

@taskinoor: Khi bạn nói về mẫu bit -1, có vẻ như tôi đã ngụ ý rằng việc quảng cáo ngầm từ 'char' đến' unsigned' phụ thuộc vào biểu diễn bên dưới của 'char' trong việc thực hiện (ví dụ: hai bổ sung) mà không chính xác. –

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