uint8_t a = 0x1234;
请a == 34
?这是因为0x34
是第一个字节吗?
如果是,我如何执行检查以确保我分配给a
的值不超过uint8_t
的大小?
答案 0 :(得分:3)
jslagle @ AR-E642-45QS3R1:〜$ cat test.c
#include <stdio.h>
#include <inttypes.h>
int main (int argc, char **argv) {
uint8_t a = 0x1234;
printf("%d %x\n",a,a);
return 0;
}
jslagle@AR-E642-45QS3R1:~ $ gcc -o test test.c
test.c: In function ‘main’:
test.c:5:3: warning: large integer implicitly truncated to unsigned type [-Woverflow]
jslagle@AR-E642-45QS3R1:~ $ ./test
52 34
确实表现得那样。如果你这样做,GCC会给你一个警告。
答案 1 :(得分:0)
在这种情况下,a将取值34?因为[34]是第一个字节?
不完全是。如果你看十六进制格式的数字,它可能看起来那样。但是如果你看十进制数,0x1234 = 4660(十进制)。与上面@ user1061077给出的示例程序一样,存储的值为52
,即4660 % 256
,即除以256
时的余数。为什么256
?因为在8位内存中,您只能存储从0到255
(总256
个数字)的值。当您指定一个大于256
的值时,数字会翻转,最后会存储余数。因此,当您尝试存储256
而不是4660
时,结果值将为0
。因此,对于较大的数字,翻转的次数将完全是除法的商:number-to-be-stored / total-number-of-numbers
。在您的情况下,它是4660/256
。