小编ale*_*lim的帖子

算术按位右移"a shr b",带有存储在变量中的有符号整数 - 结果错误!内部Delphi的错误?

我有一个关于Delphi中位移行为的问题(或者更可能是错误报告)(在Borland Delphi 7中测试过).

目标:使用任意数字向右执行"算术"按位移位.

这意味着必须扩展符号位 - 如果设置了一个数字的最高有效位,则将从左侧填充二进制数,而不是0.

因此,算术右移后的数字"-1"必须保持相同的数字(所有位= 1),但是"逻辑移位"(总是用零填充数字)必须给出最大正整数(最大正有符号整数) ,为了正确)

我只在32位系统上测试过它(Windows); 而且,我需要它以32位整数显式工作.

当源编号存储在变量中时,看起来Delphi中存在带有"shr"的内部错误.

我的示例代码:

program bug;

{$APPTYPE CONSOLE}

var
I:Integer;
C:Cardinal;

begin
I := -1;  // we’ll need that later
C := $FFFFFFFF;
Run Code Online (Sandbox Code Playgroud)

(这只是开始).接下来,让我们尝试一些"shr":

Writeln('0) ', -1 shr 1 );
Writeln('1) ', $FFFFFFFF shr 1 );
Run Code Online (Sandbox Code Playgroud)

"-1"是等效于"$ FFFFFFFF"的签名.似乎"shr"行为(算术或逻辑)基于源号是签名还是不签名(整数或基数)的事实.

输出是:

0) -1
1) 2147483647
Run Code Online (Sandbox Code Playgroud)

非常正确.然后我需要尝试手动将这些数字转换为整数或基数:

Writeln('2) ', Integer(-1) shr 1 );
Writeln('3) ', Integer($FFFFFFFF) shr 1 );
Writeln('4) ', Cardinal(-1) shr 1 );
Writeln('5) ', Cardinal($FFFFFFFF) shr 1 ); …
Run Code Online (Sandbox Code Playgroud)

delphi integer bit-shift delphi-7 unsigned-integer

26
推荐指数
1
解决办法
1886
查看次数

批处理 - 如何正确分配可能包含引号的任意百分号(%1)或百分比星号(%*)参数?

在处理我之前的问题时,我遇到了一个我最初解决的类似问题.

实际上,我本月花了一些时间尝试创建一个通用的.bat帮助程序库,它将尽可能地使用任何名称处理拖放文件.我想对调用者透明地执行它,并向后兼容任何现有脚本,因此文件名以%1,%2的形式传递,我没有遇到任何问题.

@ MCND的解决方案是读取%CMDCMDLINE%然后棘手解析它.因此,我可以简单地编写set "a=%CMDCMDLINE:"=?%"- 并将完整的字符串放入变量A中,但内部的所有引号都会立即替换为问号?,从而导致我可以轻松处理的不带引号的行.

但它只适用于.bat拖放,因为这样我就无法读取从命令提示符传递的参数.我必须使用%*.

我目前的问题是:如果参数也可能包含引号字符,甚至不配对,如何阅读?

考虑以下BAT文件:(让我们调用"C:\ test.bat")

@echo off
echo START
setlocal enabledelayedexpansion

set a=%1
echo a=[!a!]

set b="%1"
echo b=[!b!]

set "c=%1"
echo c=[!c!]

set d=%~1
echo d=[!d!]

set e="%~1"
echo e=[!e!]

set "f=%~1"
echo f=[!f!]

set g=%*
echo g=[!g!]

set h="%*"
echo h=[!h!]

set "i=%*"
echo i=[!i!]

endlocal
echo DONE
exit /b
Run Code Online (Sandbox Code Playgroud)

基本上,它是一切,我能想象到读取进入批量("呼叫")百分比参数:形式%1,%~1,%*在不带引号set x=y,引用set "x=y"并明确援引 …

batch-file

5
推荐指数
1
解决办法
169
查看次数