在最近提出的一个问题中,我简单的回答强调了我对Java,JVM以及代码如何编译和运行的许多误解.这使我产生了将我的理解提升到较低水平的愿望.像汇编这样的低层次理解我没有问题字节码和JVM如何让我感到困惑.面向对象的代码如何在低级别上分解对我来说是丢失的.我想知道是否有人对如何了解JVM,字节码和Java的低级功能有任何建议.是否有任何实用程序允许您直接编写和运行字节码,因为我相信亲身体验某些东西是理解它的最佳方式?此外,我们将不胜感激地阅读有关该主题的建议.
编辑:次要问题.所以我有一个小问题,答案给了我一个有趣的想法来了解jvm,写一个非常简单的语言如brainf**k或Ook的合理性只是用一种可读的语法(也许我甚至可以开发它)最终支持oo)编译成字节码是什么?这会是一个很好的学习经历吗?
在POSIX环境中使用系统调用来操作文本文件(open(), close(), read(), write())时,有没有办法检查我在使用时是否实际关闭了文件描述符close(file_descriptor)?
示例:
int main(int argc, char **argv)
{
int input_file; // file descriptor for input file
int output_file; // file descriptor for output file
input_file = open(argv[1], O_RDONLY));
ouput_file = open(argv[2], ...file properties & permissions and crap.....);
// blah blah blah...
close(input_file);
close(output_file);
// what can I code here to check if the file descriptor was actually closed?
}
Run Code Online (Sandbox Code Playgroud) 好吧,我已经在整个互联网上搜索了将使用arm-linux-gnueabi-as和qemu运行的代码.要打印整数值.来自字符串.例程会有所帮助.
码:
char keyStr[50]={ 0x5F, 0x80 /* bla bla */ };
uint32_t* reCast = reinterpret_cast< uint32_t* >( &keyStr[29] );
uint32_t* reCast2 = ( uint32_t* )&keyStr[29];
if( reCast == reCast2 ){
cout << "Same Thing!";
}
Run Code Online (Sandbox Code Playgroud)
输出:
一样!
我想知道这两种铸造方法有什么区别。另外,如果您可以(通过示例)指定static_cast,dynamic_cast和您知道的其他类型的转换之间的差异(即,保持较低的级别并尽可能接近汇编语言)。
static_cast
dynamic_cast
const_cast
reinterpret_cast
C-style cast (type)value
Function-style cast type(value)
Run Code Online (Sandbox Code Playgroud)
谢谢。
请阅读我从上面的示例中了解到的PS,reinterpret_cast将int指针分配给int指针keyStr [29]的地址在汇编中将转换为:
lea eax, [keyStr+1D]
mov [reCast], eax
Run Code Online (Sandbox Code Playgroud)
因此,换句话说,从低级别的角度来看,reinterpret_cast根本没有危险,因为它不会修改原始数据。
我想知道其他铸造方法在低水平方面的表现。因此,例如,对象以低级方式仅仅是保存地址的变量。以及该对象的类型是编译器随后如何解释该地址及其偏移量。对象(即另一个指针))。另一件事可能是相同的,就是int和int *或unsigned int和int之间的区别;所有4个声明都生成相同的汇编指令。(推送值)或(sub esp-(int的长度)&& mov esp,值)我希望这可以澄清问题,以及为什么我将其标记为“低级代码”和“汇编”
PS在此程序中,我尝试创建我不在乎非可移植性或其他高级内容。我正在尝试尽可能降低级别,并尽可能接近汇编语言。这意味着,对于该程序,内存只是内存(即0和1位),类型并不重要(例如,我不在意内存地址:0x123是“ int”类型还是“ float”类型,只是“数据”)
我是一名中级图形程序员.我想从头开始学习音频/声音处理理论.
就像"A像素"及其组件R,G,B,A是图形编程的基本部分一样.我想知道类似的声音编程.
有人能指出我的好链接吗?另外我想知道一些允许我操纵声音的库(最好是便携式的).可以直接用于mp3,amr文件的东西.
我也不介意书的推荐:)
我基本上想做的是
对于例如:"A"六角equivalant是0x61,我可以拆分61中6和1,并将其保存为'6'和'1'?
缓冲区正在接收如下数据:
rx_dataframe.data[0] is H'00,'.'// H' is Hex equivalant and '' is ASCII value
rx_dataframe.data[0] is H'31,'1'
rx_dataframe.data[0] is H'32,'2'
rx_dataframe.data[0] is H'33,'3'
Run Code Online (Sandbox Code Playgroud)
我需要转换hex values 0x00,0x31,0x32,0x33为char值'0','0','3','1','3','2';'3','3'
并将它们存储在的位置tx_buff_data[];
我想要tx_buff_data这样的样子
tx_buff_data[0] have H'30,'0'
tx_buff_data[1] have H'30,'0'
tx_buff_data[2] have H'33,'3'
tx_buff_data[3] have H'31,'1'
tx_buff_data[4] have H'33,'3'
tx_buff_data[5] have H'32,'2'
tx_buff_data[6] have H'33,'3'
tx_buff_data[7] have H'33,'3'
Run Code Online (Sandbox Code Playgroud) 我想编写一个获得数字X的函数,如果X = 5则返回7,如果X = 7则返回5,否则返回其他内容.有一些简单的方法 - 使用"if"块另一种方式 - 使用地图(5映射到7,7映射到5)第三种方式 - 写出匹配的线性数学方程式但是我正在寻找第4种方式这样做(再次 - 根本不使用"if"块).
感觉我需要使用位操作,但我在这方面不占优势,所以我需要帮助.
有任何想法吗?
谢谢!
While typing a program as a high level programmer, n = 0; looks more efficient and clean.
But is n = 0; really more efficient than if (n != 0) n = 0;?
when n is more likely to be 0.
when n is less likely to be 0.
when n is absolutely uncertainty.
Language: C (C90)
Compiler: Borland's Turbo C++
Minimal reproducible code
void scanf();
void main()
{
int n; // 2 bytes
n=0; // Expression …Run Code Online (Sandbox Code Playgroud) 假设你有一个32位无符号整数,其中字节举办这样的:a b c d。什么是这些字节扩展到64位无符号整数,以这种方式最快的方法:
0 a 0 b 0 c 0 d?它是为了x86-64架构。我想知道不使用特殊内在函数的最快方法,尽管这也很有趣。(我说'最快',但具有合理性能的紧凑解决方案也很好)。
为需要上下文的人编辑。这似乎是一项非常简单的工作,只需移动一些字节,但它需要的指令比您想象的要多(检查这个带优化的神箭)。因此,我只是想知道是否有人知道一种可以用更少的指令解决问题的方法。
c ×6
c++ ×2
low-level ×2
low-level-io ×2
arm ×1
assembly ×1
audio ×1
bytecode ×1
casting ×1
if-statement ×1
java ×1
jvm ×1
machine-code ×1
performance ×1
qemu ×1
variables ×1