01/10/2018, 08:19

Tại sao kiểu dữ liệu int là 2 byte nhưng vẫn biểu diễn được giá trị pow(2,40)

dạ như tiêu đề ạ.
em thắng mắc là kiểu int trong C/Cpp chỉ có 2byte.
nhưng khi em thực hiện
int n;
n=pow(2,40);
cout<<n;
thì vẫn biểu diễn ra giá trị của n

Hoang Kien viết 10:22 ngày 01/10/2018

Ngày xưa là 2byte giờ int là 4 byte bằng long rồi :v

Quân viết 10:20 ngày 01/10/2018

4 byte cũng không đủ để lưu kết quả của phép tính này, cần ít nhất 5 byte đối với kiểu unsigned và 5 byte + 1 bit đối với kiểu signed, do đó khi biên dịch có thể trình dịch đã tự infer sử dụng kiểu int64 tức dùng 8 byte để lưu kết quả

rogp10 viết 10:23 ngày 01/10/2018

^ Nếu nó tính sẵn mà int 4 byte thì cũng phải gọt lại thôi.

Tính lại xem nó có ra đúng không nếu đúng là int lên 8 byte rồi.

Thực ra sizeof(int) là kích thước của 1 word trên nền tảng đó, còn long short long long gì đấy đều rất vô chừng. Nếu muốn đúng (để xài bitmask chẳng hạn) thì tìm int32_t.

Hoang Kien viết 10:22 ngày 01/10/2018

À quên hỏi bạn dùng ide gì và HĐH gì. Nếu nhớ ko nhầm thì nếu bạn dùng visual trên win 64bit thì int sẽ là 8 byte. Ide khác mình ko rõ lắm.

rogp10 viết 10:28 ngày 01/10/2018

Thớt chắc dùng sách cũ lắm lắm rồi mới có int 2 byte, giờ chỉ cần hỏi thớt 1 câu sizeof(int) bằng mấy thôi.

guo_da viết 10:33 ngày 01/10/2018

thế ạ. lâu nay e cứ tưởng int là 2 byte chứ.
em dùng win 7x64 bit. ide là codeblock ạ.
sizeof(int)=4
à. rồi e test thử lại thì do lúc nãy e test mỗi 2^40
2^40=2^31 tức là nó tự gán bằng max luôn.
Tks các bác ạ

Nguyễn Xuân Phúc viết 10:29 ngày 01/10/2018

nó không tự chuyển sang 8byte đâu nha bạn, nó chỉ sử dụng cơ chế tràn số của C/C++, loại bỏ các bit nằm ngoài vùng lưu trữ.

viết 10:21 ngày 01/10/2018

Floating–integral conversions
A prvalue of floating-point type can be converted to a
prvalue of any integer type. The fractional part is truncated, that is,
the fractional part is discarded. If the value cannot fit into the
destination type, the behavior is undefined (even when the destination
type is unsigned, modulo arithmetic does not apply).

ko xác định luôn chứ ko sử dụng cơ chế tràn số nữa

#include <iostream>

int main()
{
    int n = 3e9;
    std::cout << n;
}

thử trên

  • g++ in ra 2147483647 là INT_MAX
  • vc++ in ra -1294967296 là cơ chế tràn số
  • clang cho kết quả ngẫu nhiên…
Bài liên quan
0