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ừ
int
và unsigned
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).
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
@ Devjosh, không có bạn là sai. '-1' không phải là ký tự hợp lệ. – taskinoor
@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