位运算是底层开发中常用的C语言运算,移位运算是相当有用的一种运算。举例说明:
int main() {
long a;
long b = a << 16;
long long c;
long long d = c << 16;
return 0;
}
在这里写了两种位移运算,是比较典型的,一种是32位长度数据的位移,另一种是64位长度数据的位移。由于x86架构的计算机寄存器长度为32,因此64位的数据位移操作怎样在32位长的寄存器上完成呢?
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-8, %esp //内存对齐(由于存在64位长度的栈数据)
subl $32, %esp
movl 28(%esp), %eax //变量a读入寄存器eax,时钟周期数4
sall $16, %eax //一条位移指令就解决了位移,$16是立即数,时钟周期数3
movl %eax, 24(%esp) //写回变量b,时钟周期数2
movl 16(%esp), %eax //这里是变量c的低32位,时钟周期数4
movl 20(%esp), %edx //这里是变量c的高32位,时钟周期数4
shldl $16, %eax, %edx //双精度位移,时钟周期数3
sall $16, %eax //普通位移,时钟周期数3
movl %eax, 8(%esp) //写回变量d低32位,时钟周期数2
movl %edx, 12(%esp) //写回变量d高32位,时钟周期数2
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
这里有一个比较特殊的指令shld,是双精度位移指令,这条指令会将低32位与高32位同时进行左移操作,低32位移出的部分会自动填充到高32位中去,完成以后低32位会被还原为移位以前的状态。因此在完成双精度位移以后,还需要再对低32位进行一次位移才能够满足要求。
在x86体系下,完成C语言64位数据位移的时钟周期数恰好是32位数据位移的时钟周期数的两倍。
分享到:
相关推荐
C语言是一种广泛使用的编程语言,特别是在系统编程中,其位运算功能是实现底层操作不可或缺的工具。位运算允许程序员直接在内存中的二进制位级别上进行操作,这为优化程序性能和处理硬件相关的任务提供了极大的灵活...
在这个实验中,将指导学生学习C语言的位运算,包括位运算符、位移运算等内容。这将帮助学生掌握C语言的位运算和编程技巧。 实验12:文件 在这个实验中,将指导学生学习C语言的文件操作,包括文件的读写、文件的...
这包括位移操作、位逻辑运算(如与、或、异或)以及位字段。 此外,理解预处理器宏和编译时计算也是C语言进阶的一部分。预处理器宏可以用于代码的条件编译,减少代码重复,甚至实现简单的函数式编程。编译时计算则...
8. **位运算**:位移、按位与、按位或、按位异或等操作,用于低级数据处理和位逻辑运算。 9. **预处理**:宏定义、条件编译等预处理指令的应用。 10. **错误处理和调试**:学会使用编译器的错误提示,理解运行时错误...
C语言中位运算置0操作 在C语言中,位运算是一种非常重要的操作,经常用于对二进制数据进行操作。在本文中,我们将详细介绍C语言中位运算置0操作的实现方法。 位运算的定义 位运算是指对二进制数据进行操作的...
9. **位运算**:第12章讲述了位运算符,如按位与、按位或、按位异或和位移,这些在底层编程和优化代码时十分关键。 10. **全国计算机等级考试(二级)---C语言程序设计考试大纲及习题**:附录中的PPT提供了考试大纲...
5. **位运算**:C语言支持位级别的操作,如位移、按位与、按位或、按位异或,这对于低级别硬件操作和高效算法实现非常有用。 6. **内存管理**:动态内存分配(malloc、calloc、realloc、free)是C语言的一大特色,...
11. **位运算**:C语言支持位级操作,如位移、按位与、按位或、按位异或等,这对于底层编程和硬件交互至关重要。 12. **标准库函数**:如数学函数、输入/输出函数、字符串处理函数等,是C语言开发中常用的辅助工具...
9. **位运算**:理解二进制运算,如位移、按位与、按位或、按位异或等,这些在特定场景下有重要作用。 通过【全国计算机等级考试二级C语言历年试题及答案合集.CHM】,考生可以系统地进行模拟练习,检查自己的薄弱...
在C语言环境中实现SHA-512运算,通常涉及到以下几个核心知识点: 1. **散列函数的基本概念**:散列函数是将任意长度的输入(又称预映射或消息)转化为固定长度输出的函数。这种转换的输出值称为散列值或摘要。SHA-...
在C语言中,源代码是由一系列函数、变量定义和控制结构组成的文本文件,这些文件经过编译后生成可执行程序。通过研究经典的C语言源代码,我们可以学到以下关键知识点: 1. **基本语法**:C语言的语法简洁而直接,...
10. **位运算**:介绍位操作符,如何进行位移、按位与、按位或、按位异或等操作,以及它们在实际问题中的应用。 11. **编程实践**:通过一系列的练习题和项目,让学习者将理论知识转化为实际编程能力,培养解决问题...
4. **位运算**:掌握位运算符,如位移、与、或、异或,用于高效地操作硬件寄存器。 5. **预处理器宏**:理解预处理器的作用,学习宏定义和条件编译,以便在不同环境下编写可复用的代码。 6. **错误处理**:学习...
9. **第九章_预处理命令**:预处理器在编译阶段的角色,如宏定义、条件编译等,这些都是C语言中提高代码可读性和复用性的重要工具。 10. **第十章_指针**:C语言的精髓之一,讲解指针的声明、使用,通过指针操作...
- C语言支持位级操作,如位移、按位与、按位或、按位异或,这对于底层编程和硬件交互特别有用。 8. **错误处理**: - C语言没有内置的异常处理机制,但通过返回值和全局错误代码,开发者可以自定义错误处理策略。...
C语言支持位级操作,如位移、按位与、按位或、按位异或等,这些操作在底层硬件编程和数据编码中非常有用。 九、错误处理 在C语言编程中,错误处理通常是通过检查函数返回值和设置全局变量来实现的,如errno和perror...
位运算是C语言中的基本概念,包括位移运算和位逻辑运算。位移运算包括左移和右移,位逻辑运算包括与、或、非等。 十、转义字符 转义字符是C语言中的特殊字符,包括换行符、回车符、制表符等。转义字符可以用于格式...
9. **位运算**:C语言支持对二进制位进行操作,如位移、按位与、按位或、按位异或等。这在处理硬件接口或低级别编程时非常重要。 10. **标准库函数**:C语言标准库提供了大量功能函数,如数学运算、字符串处理、...
预处理器宏是C语言的特色,它们可以在编译时进行文本替换,实现代码复用和条件编译。头文件用于组织和共享代码,理解如何正确使用#include指令和如何创建自定义头文件对于模块化编程至关重要。 三、函数和递归 ...
11. **位运算**:C语言支持对整数类型的位进行操作,如位移、按位与、按位或、按位异或等,常用于低级编程和优化。 12. **标准库函数**:如数学函数(sin、cos、exp等)、字符串处理(strcpy、strcat、strcmp等)和...