Ngôn ngữ tôi sử dụng là C. Loại x và n là int.Sự khác biệt giữa ~ (x-1) và ~ x + 1 khi x = 0x80000000
tôi có một dòng mã như sau
printf("x=%x,n=%d,first=%x,second=%x\n",x,n,((~(x+0xffffffff))>>n),((~x+1)>>n));
Nó cho thấy giá trị của x, n và hai phương pháp chuyển n bit của số bù của x. Khi x = 0x80000000, ~ (x + 0xffffffff) = 0x8000000, ~ x + 1 = 0x80000000, nhưng khi chuyển hai số này bằng n bit, kết quả sẽ khác nhau.
btw, nếu tôi thay đổi 0xffffffff tới ~ 1 + 1 (có nghĩa là ~ (x + (~ 1 + 1)), kết quả là giống như ~ x + 1
Tôi tự hỏi tại sao điều đó xảy ra. Cảm ơn .
[Là “(uint16_t) -1 ″ Mã C di động?] (Http://embeddedgurus.com/barr-code/2011/06/is-uint16_t-1-portable-c-code/) – Lundin
@Lundin Bài viết đó sai. '(uint16_t) -1' ** được ** đảm bảo bởi chuẩn để tạo ra' 0xFFFF' nếu việc thực hiện cung cấp kiểu đó trong 'stdint.h'. (Tất nhiên, không có gì được đảm bảo nếu đó là typedef của riêng bạn.) Không có sự mơ hồ, các loại chiều rộng cố định được yêu cầu không có bit đệm, vì vậy nó không bị hạn chế đối với các bit giá trị (tốt, đó là, vì có chỉ là bit giá trị trong 'uintN_t'). –