C:使用十六进制值的开关机箱,忽略前面的0



通过移动两个uint8变量来初始化一个uint32变量

uint32_t test = ((first_uint8 << 16) | second_uint8);

在我的测试中,test的值应该是0x00170001 (0x17<<16|0x01)

然后遇到switch case

switch(test) {
   case 0x00170001:
        //do sth
        break;
   default:
        //printf invalid
        break;
}

应该转到第一种情况,但是,它总是运行到default。

然后I printf("%x", test),结果是0x170001,等于0x00170001。

最后我试着这样修改:

switch(test) {
   case 0x170001:
        //do sth
        break;
   default:
        //printf invalid
        break;
}

那么它工作得很好。

所以我对结果很好奇。

  1. 对于uint32_t变量,为什么0x170001不等于0x00170001?
  2. 如果它是由我没有memset test由0引起的,那么test也不应该等于0x170001,它应该是0x11170001或具有垃圾第一个字节的东西。
  3. 是由编译器忽略十六进制值前面的0引起的吗?我用Android NDK编译我的c代码。
  1. 对于uint32_t变量,为什么0x170001不等于0x00170001?

。0x170001, 0x0170001和0x00170001都是相等的。

2。如果它是由我没有memset测试由0引起的,那么测试也不应该等于0x170001,它应该是0x11170001或具有垃圾第一个字节的东西。

而不是,因为缺少memsettest = X的赋值将设置test中的所有位。

3。是由编译器忽略十六进制值前面的0引起的吗?我正在使用Android NDK来编译我的c代码。

这可以解释它,但我怀疑它。我觉得你更有可能是被别的东西骗了。您认为,也许您实际上并没有运行代码。如果你写0x170001还是0x00170001真的有区别,你应该把它报告为一个编译器错误——但是在这样做之前要非常确定。

请参阅这里的gcc编译的工作示例:http://ideone.com/UR566Q

最新更新