将十六进制值分配给char

时间:2011-11-23 03:22:02

标签: c

uint8_t a = 0x1234;

a == 34?这是因为0x34是第一个字节吗?

如果是,我如何执行检查以确保我分配给a的值不超过uint8_t的大小?

2 个答案:

答案 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

的商