通过移动两个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;
}
那么它工作得很好。
所以我对结果很好奇。
- 对于uint32_t变量,为什么0x170001不等于0x00170001?
- 如果它是由我没有memset
test
由0引起的,那么test
也不应该等于0x170001,它应该是0x11170001或具有垃圾第一个字节的东西。 - 是由编译器忽略十六进制值前面的
0
引起的吗?我用Android NDK编译我的c代码。
- 对于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