2016-06-03 14 views
7

Trong C,Loại dữ liệu mặc định của số trong C là gì?

unsigned int size = 1024*1024*1024*2; 

mà kết quả là một cảnh báo "integer overflow trong biểu ..." Trong khi

unsigned int size = 2147483648; 

kết quả không cần báo trước?

Giá trị đúng của biểu thức đầu tiên có được mặc định là int không? Nó đề cập đến đâu trong spec C99?

+1

Bạn có chắc chắn giá trị thứ hai không phải là ['2147483648'] (https://www.google.co.in/search?q=1024*1024*1024*2&rlz=1C1GIGM_enIN617IN617&oq=1024*1024*1024*2&aqs = chrome..69i57.1172j0j7 & sourceid = chrome & ie = UTF-8)? –

+0

Bạn có thể có nghĩa là giá trị '2147483648'. Câu trả lời của tôi giả định điều này. – 2501

+0

Đã được sửa chữa! Cảm ơn! – mingpepe

Trả lời

9

Khi sử dụng một hằng số thập phân mà không cần bất kỳ hậu tố loại hằng số thập phân là người đầu tiên có thể được biểu diễn, để (C tiêu chuẩn hiện hành, 6.4.4 Constants p5):

  • int
  • dài int
  • lâu dài int

các loại biểu hiện đầu tiên là int, vì mỗi liên tục với giá trị 1024 và 2 có thể được biểu diễn dưới dạng int. Việc tính toán các hằng số đó sẽ được thực hiện trong kiểu int, và kết quả sẽ tràn.

Giả sử INT_MAX bằng 2147483647 và LONG_MAX lớn hơn 2147483647, loại biểu thức thứ hai là long int, vì giá trị này không thể được biểu diễn dưới dạng int, nhưng có thể dài int. Nếu INT_MAX bằng LONG_MAX bằng 2147483647, thì loại là long long int.

+1

Trừ khi INT_MAX == LONG_MAX, trong trường hợp này, biểu thức thứ hai có thể là loại 'long long int'. Lưu ý rằng Win64 là môi trường 64 bit, trong đó INT_MAX == LONG_MAX; hầu hết các môi trường 32 bit chạy với INT_MAX == LONG_MAX. –

+0

@JonathanLeffler Cảm ơn bạn. Có những giới hạn chung, tôi nên nhớ điều đó. – 2501

3
unsigned int size = 1024*1024*1024*2; 

biểu hiện này 1024*1024*1024*2 (trong biểu thức 10242 là loại signed int) tạo ra kết quả đó là loại signed int và giá trị này là quá lớn cho signed int. Vì vậy, bạn nhận được cảnh báo.

Sau khi phép nhân được ký, nó được gán cho unsigned int.

+0

tôi biết rằng giá trị là tràn cho int đã ký. Nhưng tại sao nó được ký int? – mingpepe

+1

@mingpepe Bởi vì mặc định '1024' và' 2' là các số nguyên đã ký, nên kết quả phép nhân cũng thuộc kiểu 'signed int' và sau đó kiểu được thay đổi khi được gán cho' unsigned int'. – ameyCU

+0

Sản phẩm '1024 * 1024 * 1024 * 2' tràn và tràn' int' là UB. Tốt hơn nên sử dụng '1024u * 1024 * 1024 * 2' – chux

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