2012-03-15 30 views
5

Tôi nhầm lẫn về cách quảng cáo loại xảy ra trong trường hợp printf và nói chung. Tôi đã thử các mã saukhuyến mãi loại printf và phần mở rộng ký hiệu

unsigned char uc = 255 
signed char sc = -128 

printf("unsigned char value = %d \n", uc); 
printf("signed char value = %d \n", sc); 

Điều này cho phép đầu ra sau đây:

unsigned char value = 255 
signed char value = -128 

này đã để lại cho tôi băn khoăn về cách thức xúc tiến thực sự diễn ra và cho dù một phần mở rộng dấu hiệu xảy ra hay không. Nếu phần mở rộng dấu được thực hiện thì giá trị 255 sẽ được in dưới dạng giá trị âm (-128 còn lại) và nếu không có phần mở rộng dấu hiệu được thực hiện thì -128 phải được in dưới dạng giá trị dương (255 còn lại). Vui lòng giải thích.

Trả lời

4

Nếu một phần mở rộng dấu được thực hiện thì giá trị 255 sẽ được in như giá trị âm

Đây là nơi bạn sai rồi - tất cả các giá trị của loại unsigned char bao gồm 255, có thể được biểu diễn trong một int , do đó, quảng cáo đến int từ unsigned char chỉ xảy ra mà không có bất kỳ doanh nghiệp vui nhộn nào.

Trường hợp sự cố xảy ra là khi giá trị đã ký phải là được chuyển đổi (một điều khác với quảng cáo và xảy ra để tạo loại phổ biến cho toán hạng) cho giá trị chưa ký. Nếu loại đã ký đó có giá trị âm, thì chuyển đổi thành loại chưa ký sẽ thay đổi giá trị.

Tóm lại, quảng bá số nguyên duy trì giá trị (bao gồm dấu), chuyển đổi có thể thay đổi giá trị.

2

Mở rộng ký được thực hiện. Nhưng bạn không thể ký mở rộng unsigned char vì nó không có bit dấu. Toàn bộ điểm mở rộng của dấu hiệu là giữ cho giá trị giống nhau. Hoặc, nếu bạn muốn nghĩ về nó theo cách này, mọi biến không dấu có một bit dấu bằng không. Vì vậy, khi nó được mở rộng bằng dấu hiệu đến một loại có chữ ký lớn hơn, bit dấu phải là số không trong loại lớn hơn.

0

Mở rộng ký được thực hiện.

Nhưng kể từ trường hợp của uc, không có dấu hiệu, vì nó là một unsigned char, do đó, nó là trái tích cực.

1

Cả hai đều được quảng cáo thành int - do đó giữ dấu.

4

Chức năng va_arg không có thông tin về loại mong đợi cho phần .... Do đó, các quy tắc khuyến mãi cho các chức năng như được khai báo mà không áp dụng nguyên mẫu. Điều này có nghĩa là tất cả các loại ngắn hơn int đều được thăng cấp trực tiếp đến int hoặc unsigned. Vì vậy, chức năng printf của bạn không bao giờ nhìn thấy (un)signed char.

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