Tôi đang gặp sự cố kỳ lạ với C++ khi kiểu dữ liệu dài bị tràn lâu trước khi nó xảy ra. Những gì tôi đang làm (với thành công cho đến nay) là có các số nguyên hoạt động như phao nổi, do đó phạm vi [-32767,32767] được ánh xạ tới [-1.0,1.0]. Nơi mà nó tình cờ là với đối số lớn hơn đại diện nổi lớn hơn 1.0:C++ dài tràn quá sớm
inline long times(long a, long b) {
printf("a=%ld b=%ld ",a,b);
a *= b;
printf("a*b=%ld ",a);
a /= 32767l;
printf("a*b/32767=%ld\n",a);
return a;
}
int main(void) {
printf("%ld\n",times(98301l,32767l));
}
Những gì tôi có được như đầu ra là:
a=98301 b=32767 a*b=-1073938429 a*b/32767=-32775
-32775
Vì vậy, lần (98301,32767) là tương tự như 3.0 * 1.0. Mã này hoạt động hoàn hảo khi các đối số với thời gian nhỏ hơn 32767 (1.0), nhưng không có bước trung gian nào với các đối số trên sẽ tràn 64 bit dài.
Bất kỳ ý tưởng nào?
Bạn có thể chấp nhận câu trả lời sau đó không, nó giúp mọi người sẵn sàng giúp đỡ bạn trong tương lai. –