我通过移动两个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;
}
然后它运作良好。
所以我对结果感到好奇。
test
设置为0,那么test
也应该不等于0x170001,它应该是0x11170001或者具有垃圾第一个字节的东西。 0
引起的?我使用Android NDK编译我的c代码。答案 0 :(得分:0)
- 对于uint32_t变量,为什么0x170001不等于0x00170001?
醇>
确实如此。 0x170001,0x0170001和0x00170001都是相等的。
2.如果它是由于我没有将memset测试引起0,那么测试也应该不等于0x170001,它应该是0x11170001或者带有垃圾第一个字节的东西。?
缺少memset
导致不。任何作业test = X
都会在test
中设置所有位。
3.它是由编译器忽略十六进制值前面的0引起的吗?我正在使用Android NDK编译我的c代码。
这可以解释它,但我怀疑。我认为你被其他东西欺骗的可能性更大。你想也许你实际上并没有运行代码。如果真的证明无论你是写0x170001
还是0x00170001
都有所不同,你应该把它报告为编译器错误 - 但在这之前要确定一点。
请点击此处查看使用gcc
编译的工作示例:http://ideone.com/UR566Q