tôi có mã này trong C (đó là để nghiên cứu chỉ):C thay đổi còn lại trên 64 bit không
char x;
uint64_t total = 0;
for(x = 20; x < 30; x++){
total = (((((1 << x) * x)/64) + 1) * sizeof(uint64_t));
printf("%d - %llu\n", x, total);
}
gì được in:
20 - 2621448
21 - 5505032
22 - 11534344
23 - 24117256
24 - 50331656
25 - 104857608
26 - 218103816
27 - 18446744073625665544
28 - 18446744073575333896
29 - 18446744073508225032
Tại sao tại x> 26 Tôi phải làm những giá trị lạ? Tôi đang ở gcc 4.6.1 trên Ubuntu 10,10 64 bit.
trông giống như vấn đề là tại char x, tôi đã sử dụng uint64_t cho nó và hoạt động tốt. –
Bạn sẽ có thể thấy điều gì đang xảy ra rõ ràng hơn nếu 'total = (((((1 << x) * x)/64) + 1) * sizeof (uint64_t));' được đơn giản hóa thành 'total = ((1 << x) * x); 'sau đó được in bằng' printf ("% d - 0x% llx \ n", x, tổng số); 'bạn sẽ thấy bit dấu hiệu chuyển số âm nmber, được in thành một số lượng lớn bởi printf ("... -% llu \ n", ... tổng cộng); – gbulmer