Chuyển uint_64_t sang va_list không chính xác
Tôi đang viết một printf
hàm tùy chỉnh và một hàm uint64_t
dường như được chuyển không chính xác thành va_list
:
Điểm có vấn đề:
printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);
Một phần trong printf
quá trình triển khai của tôi tạo ra kết quả không chính xác:
format++;
uint64_t num = va_arg(parameters, uint64_t);
Khi gỡ lỗi với gdb, giá trị của num
trở thành 0xffffffffff00ffb7
thay vì 0xff00ffb7
tôi mong đợi và giá trị tiếp theo %C
num
trở thành 0. Đây có phải là một số hành vi tiêu chuẩn mà tôi đang thiếu hay tôi đang làm sai điều gì đó?
Trả lời
Nếu 0xff00ffb7
được định nghĩa là uint64_t
cho một hàm khác nhau, hãy truyền nó.
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7
, dưới dạng một hằng số nguyên, có kiểu int, unsigned, long, unsigned long, long long
hoặc ,: kiểu unsigned long long
đầu tiên mà nó "phù hợp". Với 32-bit int/unsigned
, 0xff00ffb7
có thể sẽ là unsigned
nguồn gốc gây ra rắc rối của OP.
Phụ thêm u
để một hằng số là tốt ý tưởng để đảm bảo nó là một số loại unsigned.
Thêm L
hoặc LL
vào một hằng số không phải là một ý tưởng hay để đảm bảo một hằng số là uint64_t
. Hoặc có thể khớp ( LL
thường sẽ), nhưng các hậu tố này không đảm bảo loại đó.
Sử dụng UINT64_C(0xff00ffb7)
tạo thành một hằng số kiểu uint_least64_t
chắc chắn giống như uint64_t
trên các máy có uint64_t
.