C:带十六进制值的switch case忽略前面的

时间:2016-10-28 04:25:02

标签: c android-ndk switch-statement

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

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

在我的测试中,test的值应为0x00170001(0x17&lt;&lt; 16 | 0x01)

然后它会遇到switch case

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

它应该转到第一种情况,但它总是遇到默认情况。

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

最后我尝试修改它:

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

然后它运作良好。

所以我对结果感到好奇。

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

1 个答案:

答案 0 :(得分:0)

  
      
  1. 对于uint32_t变量,为什么0x170001不等于0x00170001?
  2.   

确实如此。 0x170001,0x0170001和0x00170001都是相等的。

  

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

缺少memset导致。任何作业test = X都会在test中设置所有位。

  

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

这可以解释它,但我怀疑。我认为你被其他东西欺骗的可能性更大。你想也许你实际上并没有运行代码。如果真的证明无论你是写0x170001还是0x00170001都有所不同,你应该把它报告为编译器错误 - 但在这之前要确定一点。

请点击此处查看使用gcc编译的工作示例:http://ideone.com/UR566Q