左移一个整数32位
Left shift an integer by 32 bits
在GCC下,如果num1s == 0
,以下代码总是返回<<
的左操作数:
0xFFFFFFFFu << (32-num1s);
阅读后,为什么't左位移位,"<<",对于32位整数,当使用超过32次时,不能正常工作?在David Heffernan引用的标准中,如果左操作数为unsigned,则它是一个定义操作。只有当E1(左操作数)具有带符号类型且非负值时,才可能导致未定义行为。
如果标准明确规定,如果移位量大于类型包含的位数,则为未定义行为,谁能解释一下?
§5.8移运算符
操作结果的类型为提升后的左操作数的类型。如果右操作数为负,或者大于等于提升后的左操作数的位长度,则不定义此行为。
E1 << E2
的值为E1
左移E2
位;空出的位是零填充的。如果E1
是unsigned类型,则结果的值是E1 × 2E2
,比结果类型中可表示的最大值多取1。否则,如果E1
为有符号类型且非负值,且E1×2E2
在结果类型中可表示,则该值为结果值;否则,行为是未定义的。
CoryKramer已经回答了为什么它是标准的未定义行为。
我将试着解释它在实际情况下是如何工作的。c++编译器通常将32位整数的<<
和>>
操作符实现为汇编指令,而不检查操作数范围。这意味着结果取决于特定于处理器的移位指令的实现。
例如,32位SHL/SHR/SAL/SAL指令的Intel处理器规范说:
目的操作数可以是寄存器或内存位置。的count操作数可以是立即值或寄存器CL。计数是掩码为5位,限制计数范围为0 ~ 31。
这意味着a << b
在Intel处理器上变成了a << (b & 0x1f)
。因此移位32位意味着不移位。
但是你不应该依赖这些信息!编译器还可以优化代码并使用矢量指令实现移位操作符。在这种情况下,即使处理器规范也未指定该行为。
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 如何将一个数组值合并为一个整数c++
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 我可以将迭代器递增一个整数吗?
- 有没有办法生成一个包含平方的序列,这些平方加起来就是一个整数平方?
- 为什么将两个浮点数相加会得到一个整数C++?
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 给枚举一个整数,并在 C++ 中将其相关值作为字符串获取
- 按升序输出整数时,将最后一个整数放在新行上
- 编写一个程序,提示用户输入一个整数,然后输出数字的单个数字和数字的总和
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 给定一个整数,将其表示为平方和
- c++interpret_cast是一个整数
- 以最少的步骤将给定整数转换为另一个整数
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 我需要将字符串(例如 A5)转换为一个字符串 (A) 和一个整数 (5)
- 如何交替从文件中获取一行数据和一个整数?
- 如何让这个C++代码从用户那里读取五个整数而不是一个整数?