Tại sao kích thước của kiểu dữ liệu khác nhau khi giá trị được truyền trực tiếp đến toán tử sizeof?


15
#include <stdio.h>
int main() {
    char a = 'A';
    int b = 90000;
    float c = 6.5;
    printf("%d ",sizeof(6.5));
    printf("%d ",sizeof(90000));
    printf("%d ",sizeof('A'));
    printf("%d ",sizeof(c));
    printf("%d ",sizeof(b));
    printf("%d",sizeof(a));
    return 0;
}

Đầu ra là:

8 4 4 4 4 1

Tại sao đầu ra khác nhau cho cùng một giá trị?


12
6.5không phải là một cái phao, đó là mộtdouble
NathanOliver

printf("%d",sizeof(6.5f));để làm cho nó a float.
Johnny Mopp

2
"tại sao đầu ra là differen0t ở đây?" Tại sao nó phải giống nhau? Việc bạn có thể gán cái này cho cái khác không có nghĩa là chúng có cùng loại.
Slava

5
Ví dụ, định dạng định dạng phải làprintf("%zu", sizeof(6.5));
Weather Vane

Câu trả lời:


9

Các hằng ký tự trong C (đối diện với C ++) có kiểu int. Vì vậy, cuộc gọi này

printf("%d",sizeof('A'));

đầu ra 4. Đó sizeof( 'A' )là bằng sizeof( int ).

Từ tiêu chuẩn C (hằng số ký tự 6.4.4.4)

10 Hằng số ký tự nguyên có kiểu int ....

Mặt khác (6.5.3.4 Toán tử sizeof và alignof)

4 Khi sizeof được áp dụng cho toán hạng có kiểu char, char không dấu hoặc char đã ký, (hoặc phiên bản quali của nó), kết quả là 1.

Vì vậy toán hạng của sizeoftoán tử trong biểu thức sizeof( 'A' )này có kiểu int trong khi trong biểu thức này sizeof( a )có a được khai báo như

char a = 'A';

toán hạng có kiểu char.

Hãy chú ý đến những cuộc gọi như thế này

printf("%d",sizeof(6.5));

sử dụng công cụ xác định định dạng chuyển đổi không chính xác. Bạn phải viết

printf("%zu",sizeof(6.5));

Ngoài ra trong cuộc gọi trên, có một hằng số loại doubletrong khi trong cuộc gọi này

printf("%zu",sizeof(c));

biến ccó loại float.

Bạn có thể nhận được kết quả tương tự cho các cuộc gọi này nếu cuộc gọi đầu tiên sử dụng hằng số kiểu float như

printf("%zu",sizeof(6.5f));

19

Các hằng số, giống như các biến, có một kiểu của riêng chúng:

  • 6.5 : Hằng số dấu phẩy động của loại double
  • 90000: Hằng số nguyên loại int(nếu intlà 32 bit) hoặc long(nếu intlà 16 bit)
  • 'A' : Hằng số ký tự loại inttrong C và chartrong C ++

Các kích thước được in là kích thước của các loại trên.

Ngoài ra, kết quả của sizeoftoán tử có loại size_t. Vì vậy, khi in định dạng định dạng thích hợp để sử dụng là %zukhông %d.


1

Bởi vì các giá trị không quan trọng sizeof. Đó là kích thước của các loại.

  • hằng số ký tự là ints, không phải chars.

  • Các hằng số dấu phẩy động theo mặc định doubles trừ khi bạn có hậu tố chúng bằng fhoặc l.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.