2009-04-19 45 views
6

Nói cách khác, công việc này có hoạt động như mong đợi không?32 bit int * 32 bit int = 64 bit int?

int32 i = INT_MAX-1; 
int64 j = i * i; 

hoặc tôi có cần truyền i đến 64 bit trước không?

+2

Nó phụ thuộc vào những gì bạn mong đợi - nhưng Will Dean đúng về những gì xảy ra, và nó có lẽ không phải là những gì bạn mong đợi. –

+0

Kiểm tra: http://stackoverflow.com/questions/245740/which-variables-should-i-typecast-when-doing-math-operations-in-cc/245986#245986 –

Trả lời

17

Bạn cần phải cast ít nhất một trong các toán hạng nhân lên. Tại thời điểm nhân đang được thực hiện, hệ thống không biết bạn đang lập kế hoạch để gán cho một int64.

(Trừ khi Int64 thực sự là kiểu int bản địa cho hệ thống cụ thể của bạn, mà dường như khó xảy ra)

+4

Bí quyết thông thường được nhân trên 1L trước tiên thay thế đúc: int64 j = 1L * i * i; Tính năng này hoạt động nếu thời lượng của bạn dài 64 bit. – stepancheg

+3

Và nếu 'long' của bạn chỉ là 32 bit, bạn có thể sử dụng 1LL trên các trình biên dịch hiện đại nhất. –

+1

Hoặc bạn có thể sử dụng INT64_C (1) từ stdint.h để làm cho nó hợp lý di động (bạn có thể cần phải đào lên một stdint.h cho MS trình biên dịch, có thể từ MinGW hoặc từ http://www.azillionmonkeys.com/qed/ pstdint.h –

7

Nó phụ thuộc vào những gì int32 và Int64 là. Tóm lại, tất cả các số nguyên được tăng lên ít nhất là 'int' kích thước (có thể là 64 bit) trước bất kỳ phép toán số học nào, và kích thước của toán hạng lớn hơn cho toán tử nhị phân nếu xếp hạng này lớn hơn int .

Kết quả của biểu thức được sử dụng (cho dù biểu thức được lưu trữ thành loại rộng hơn) không có ảnh hưởng đến việc quảng bá các phần cấu thành của biểu thức.

+0

+1 để giải thích thay vì quy định –

0

Cho hai số a, b và mỗi số sử dụng các bit len_a và len_b.

Kiểu dữ liệu đầu ra của bạn cần ít nhất: len_a và len_b bit.

Trong mã trên, bạn có hai số 31 bit (vì INT_MAX - 1 = 0x7FFFFFFE sử dụng 31 bit) và bạn sẽ cần phải nhập một trong số chúng vào int64_t vì nó sẽ làm nhân 32 bit và tràn trước nó chuyển sang int64_t.


Số bit cần thiết cho điểm nhân cố định:

len_output = howManyBits(a * b) 
      = len_a + len_b 

Một ví dụ nhanh chóng để hiển thị các quy tắc trên trong hành động:

a  = 7 
len_a = 3 

b  = 7 
len_b = 3 

c = a * b 
    = 49 (decimal) 
    = 0x31 (hex) 

len_c = howManyBits(0x31) 
     = 6 

Bạn có thể viết một hàm để đếm bit . Hoặc nếu bạn chỉ muốn kiểm tra sanity nhanh chóng để xác nhận điều này, hãy sử dụng một cái gì đó như Windows Calc sẽ chuyển đổi số thành dạng nhị phân và đếm số bit được sử dụng.

3

Câu trả lời cơ bản là không có nó sẽ không làm những gì bạn muốn.
Nhưng nó thực hiện những gì được mong đợi.

Hai điều cần lưu ý về các hoạt động toán học:

  • Cả hai toán hạng sẽ là cùng loại.
  • Loại kết quả sẽ giống như đầu vào.

Nếu trình biên dịch ghi chú sự không khớp giữa các toán hạng, trình biên dịch sẽ chuyển đổi một trong các toán hạng sao cho cả hai khớp (xem Which variables should I typecast when doing math operations in C/C++?). Lưu ý: Điều này được thực hiện riêng biệt với những gì xảy ra với kết quả.

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