C中1U和1之间有什么区别吗?

arr*_*arr 16 c integer

    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将生成编译器警告.更改11U删除警告消息,您不必担心如果i是31或63 会发生什么.

编译器警告很可能1U是代码中出现的原因.我建议在打开大多数警告的情况下编译C,并通过更改代码来消除警告消息.

  • `1&lt;&lt;i` 不是实现定义的。只要该值不溢出“INT_MAX”,它就是明确定义的,如果它溢出(进入符号位),则“未定义行为”。 (2认同)

Ale*_*rMP 6

1U未签名.它可以携带两倍大的值,但没有负值.

根据环境的不同,使用U时,i最大可以是31或15,不会导致溢出.不使用U,我最多可以是30或14.

31,30表示32位int 15,14
表示16位int

  • 不,他们不一样.1U << 31将起作用,1 << 31将导致溢出. (6认同)