我正在编写一个C函数,它接受一个参数n并返回一个int,其位表示为n 1,后跟足够的0来填充数据类型(总共32位).我的代码目前看起来像这样:
int upperBits(int n) {
int retval = 0 - 1;
int shift = 32 - n;
retval = retval << shift;
return retval;
}
Run Code Online (Sandbox Code Playgroud)
当n = 0时,此代码失败,返回值为-1,由32 1表示,而不是0.但是,我将shift替换为文字:
int upperBits(int n) {
int retval = 0 - 1;
int shift = 32 - n;
retval = retval << 32;
return retval;
}
Run Code Online (Sandbox Code Playgroud)
代码正常工作,返回0.我使用print语句验证当n = 0调用函数时shift = 32,所以我不明白为什么这些行为不同.造成这种差异的原因是什么,我该如何规避呢?
如果它是相关的,则代码在Linux机器上运行并使用gcc编译.我需要使用只有这些运算符的直线代码:! ˜ & ˆ | + << >>
编辑:我仍然不知道究竟是什么问题,或一个优雅的解决方案,但这种解决方法是有效的:
int upperBits(int n) {
int retval = 0 - 1;
int …Run Code Online (Sandbox Code Playgroud)