2010-02-12 72 views
42

tôi đã cố gắngTrong C, tại sao sizeof (char) 1, khi 'a' là int?

printf("%d, %d\n", sizeof(char), sizeof('c'));

và có 1, 4 như đầu ra. Nếu kích thước của một ký tự là một, tại sao 'c' cho tôi 4? Tôi đoán đó là vì nó là một số nguyên. Vì vậy, khi tôi làm char ch = 'c'; là có một chuyển đổi tiềm ẩn xảy ra, dưới mui xe, từ đó giá trị 4 byte đến một giá trị 1 byte khi nó được gán cho biến char?

+3

Tôi tin rằng nó liên quan đến việc thúc đẩy số nguyên tự động, người có nhiều sự kiện hơn niềm tin sẽ đăng câu trả lời thực tế –

+2

@Roger: Anh ấy hỏi về sự khác biệt giữa C và C++ sizeof ('a'), trong khi tôi hỏi nếu có một chuyển đổi xảy ra? Xem phần thân câu hỏi. Tôi đã suy luận rằng 'a' là một số nguyên trong C. – legends2k

+0

Tôi phải cảm ơn "David Rodríguez - dribeas" để chỉ ra liên kết trong câu trả lời của tôi là không chính xác. Tôi đang xóa câu trả lời của mình. legends2k, câu trả lời đúng nên đi đến Peter hoặc Neil, theo ý kiến ​​khiêm nhường của tôi. –

Trả lời

35

Trong C 'a' là hằng số nguyên (!?!), Vì vậy 4 là chính xác cho kiến ​​trúc của bạn. Nó được chuyển đổi hoàn toàn thành char cho bài tập. sizeof (char) luôn luôn là 1 theo định nghĩa. Tiêu chuẩn không nói đơn vị 1 là gì, nhưng nó thường là byte.

+13

+ 1 cho "nhưng nó thường là byte", tôi vẫn cười khúc khích :) –

+0

được sử dụng để là một số nguyên là 2 byte .. tiêu chuẩn không xác định được một trong hai. – lexu

+0

Tôi có thể biết lý do đằng sau tiêu chuẩn nêu rõ 'sizeof (char)' phải luôn luôn là 1? Có phải vì bảng ASCII có 256 ký tự không? Điều gì nếu trong một thực hiện tôi cần phải có nhiều hơn thế, nói unicode? – legends2k

0

Theo tiêu chuẩn ANSI C, char được thăng cấp thành int trong ngữ cảnh mà số nguyên được sử dụng, bạn đã sử dụng số định dạng số nguyên trong printf do đó các giá trị khác nhau. Một char thường là 1 byte nhưng đó là thực hiện được xác định dựa trên thời gian chạy và trình biên dịch.

+5

Định dạng số nguyên được gọi là sizeof ('a') không phải 'a' vì vậy tôi không ' t xem cách đối số này nắm giữ. –

+1

Tiêu chuẩn C cho biết một chữ char là loại int - nó có kích thước int và không có quảng cáo nào được tham gia. –

+1

Câu trả lời của bạn dường như gợi ý rằng trình biên dịch C kiểm tra một chuỗi định dạng được sử dụng bởi một hàm thư viện khi biên dịch một chương trình, bạn có chắc chắn rằng đó là trường hợp? –

7

Tiêu chuẩn Th C cho biết rằng ký tự có chữ như 'a' thuộc loại int, không phải kiểu char. Do đó, nó có (trên nền tảng của bạn) sizeof == 4. Xem this question để có một cuộc thảo luận đầy đủ hơn.

+0

Tôi đã hỏi về quảng cáo/truyền diễn ra giữa hai loại dữ liệu, trong khi thảo luận/câu trả lời không trả lời câu hỏi này. – legends2k

+1

@ legends2K Bạn hỏi "Nếu kích thước của một nhân vật là một, tại sao 'c' cho tôi 4?" Khi câu trả lời này và câu hỏi tôi liên kết giải thích rằng 'a' có sizeof == 4, rõ ràng là không có quá trình truyền hoặc quảng cáo diễn ra. –

+0

Vâng. có một hình thức chi tiết của câu hỏi, bên dưới nó, mà đọc "là có một typecasting ngầm xảy ra, dưới mui xe, từ đó giá trị 4 byte đến một giá trị 1 byte khi nó được gán cho biến char". Điều này cũng là một phần của nó, tôi tin. – legends2k

5

Đây là hành vi bình thường của các nhà điều hành sizeof (Xem Wikipedia):

  • Đối với một kiểu dữ liệu, sizeof trả về kích thước của kiểu dữ liệu. Đối với char, bạn nhận được 1.
  • Để biểu thức, sizeof trả về kích thước của loại biến hoặc biểu thức. Khi ký tự chữ được nhập là int, bạn nhận được 4.
4

Điều này được bao gồm trong ISO C11 6.4.4.4 Character constants mặc dù phần lớn không thay đổi so với tiêu chuẩn trước đó. Trạng thái đó, trong đoạn /10:

Hằng số ký tự nguyên có kiểu int. Giá trị của hằng số ký tự nguyên chứa một ký tự đơn lẻ ánh xạ tới một ký tự thực hiện một byte là giá trị số của đại diện của ký tự được ánh xạ được diễn giải dưới dạng số nguyên.

+0

+1 cảm ơn trích dẫn tiêu chuẩn; Tôi tự hỏi tại sao hằng số _integer constant_ được chọn trên hằng số _character_. – legends2k

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