while ((1U << i) < nSize) {
i++;
}
Run Code Online (Sandbox Code Playgroud)
用什么特别的理由1U代替1?
Die*_*Epp 18
在大多数编译器中,两者都会给出具有相同表示的结果.但是,根据C规范,对带符号参数的位移操作的结果给出了实现定义的结果,因此理论上 1U << i比它更便携1 << i.在实践中,你遇到过的所有C编译器都会将签名左移与无符号左移相同.
另一个原因是如果nSize是无符号的,那么将它与有符号进行比较1 << i将生成编译器警告.更改1为1U删除警告消息,您不必担心如果i是31或63 会发生什么.
编译器警告很可能1U是代码中出现的原因.我建议在打开大多数警告的情况下编译C,并通过更改代码来消除警告消息.
1U未签名.它可以携带两倍大的值,但没有负值.
根据环境的不同,使用U时,i最大可以是31或15,不会导致溢出.不使用U,我最多可以是30或14.
31,30表示32位int 15,14
表示16位int