2015-06-21 14 views
14
#include<stdio.h> 

int main() 
{ 
    printf("%d\n", sizeof(2147483648)); 
    printf("%d" , sizeof(2147483647+1)); 
    return 0; 
} 

Output:sizeof (2147483648) là 8 byte trong khi sizeof (2147483647 + 1) là 4 byte

8 
4 

Tôi hiểu rằng sizeof(2147483648) là 8 byte vì nó không thể phù hợp trong 4 byte và được thăng chức long long int. Nhưng tôi không hiểu điều gì xảy ra trong trường hợp của sizeof(2147483647+1)

Tôi đã tìm thấy similar question nhưng không thảo luận về trường hợp thứ hai.

+3

Tại sao bạn làm điều này ngay từ đầu –

+0

bản sao có thể có của [Tại sao là "int i = 2147483647 + 1;" OK, nhưng "byte b = 127 + 1;" không phải là compilable?] (http://stackoverflow.com/questions/6889176/why-is-int-i-2147483647-1-ok-but-byte-b-127-1-is-not-compilable) – GSerg

+10

' 2147483647 + 1' là một biểu thức có hai toán hạng 'int', do đó kết quả là một' int' (và có hành vi không xác định vì tràn). Tương tự, '-2147483648' là một biểu thức trong đó' 2147483648' là một 'dài int' mà sau đó có toán tử trừ đơn nhất áp dụng cho nó, –

Trả lời

18

Quy tắc của hằng số nguyên trong C là hằng số nguyên thập phân có loại đầu tiên mà nó có thể được biểu diễn trong: int, long, long long.

2147483648 

không phù hợp với một int vào hệ thống của bạn (như tối đa int trong hệ thống của bạn là 2147483647) để loại của nó là một long (hoặc một long long tùy thuộc vào hệ thống của bạn). Vì vậy, bạn đang tính toán sizeof (long) (hoặc sizeof (long long) tùy thuộc vào hệ thống của bạn).

2147483647 

là một int trong hệ thống của bạn và nếu bạn thêm 1 một int nó vẫn là một int. Vì vậy, bạn đang tính toán sizeof (int).

Lưu ý rằng sizeof(2147483647+1) gọi hành vi undefined trong hệ thống của bạn như INT_MAX + 1 tràn và ký số nguyên tràn là hành vi không xác định trong C.

Lưu ý rằng trong khi thường 2147483647+1 gọi hành vi undefined trong hệ thống của bạn (INT_MAX + 1 tràn và tràn số nguyên ký là hành vi không xác định trong C), sizeof(2147483647+1) không gọi hành vi không xác định là toán hạng của sizeof trong trường hợp này không được đánh giá.

+2

Bạn có chắc là có hành vi không xác định ở đây, cho rằng biểu thức xuất hiện như một đối số cho 'sizeof' hơn là trong một ngữ cảnh mà nó sẽ được đánh giá? – Hurkyl

+3

Tôi nghi ngờ rằng nó sẽ gọi UB. '2147483647 + 1' sẽ không được đánh giá. – haccks

+1

Có thể có liên quan: [Không đánh giá biểu thức mà kích thước được áp dụng làm cho nó hợp pháp để dereference một con trỏ null hoặc không hợp lệ bên trong sizeof trong C + +?] (http://stackoverflow.com/q/28714018/11683). – GSerg

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