在x86汇编中,当有符号整数上的add或sub操作溢出时,溢出标志置位,当无符号整数上的操作溢出时,置载标志置位.
然而,当谈到inc和dec说明,情况似乎有些不同.根据该网站,该inc指令根本不影响进位标志.
但我不能找到有关如何的任何信息inc和dec如果有的话,会影响溢出标志.
发生整数溢出时执行inc或dec设置溢出标志?对于有符号整数和无符号整数,这种行为是否相同?
============================= 编辑 ==================== =========
好的,基本上这里的共识是,就设置标志而言,INC和DEC应该与ADD和SUB的行为相同,但进位标志除外.这也是英特尔手册中的内容.
问题是,当涉及到无符号整数时,我实际上无法在实践中重现这种行为.
请考虑以下汇编代码(使用GCC内联汇编以便更轻松地打印结果.)
int8_t ovf = 0;
__asm__
(
"movb $-128, %%bh;"
"decb %%bh;"
"seto %b0;"
: "=g"(ovf)
:
: "%bh"
);
printf("Overflow flag: %d\n", ovf);
Run Code Online (Sandbox Code Playgroud)
这里我们递减一个带符号的8位值-128.由于-128是可能的最小值,溢出是不可避免的.正如所料,这打印出:Overflow flag: 1
但是当我们使用无符号值执行相同操作时,行为并不像我预期的那样:
int8_t ovf = 0;
__asm__
(
"movb $255, %%bh;"
"incb %%bh;"
"seto %b0;"
: "=g"(ovf)
:
: "%bh"
); …Run Code Online (Sandbox Code Playgroud) 随着时间的推移,出现了STL*的各种替代实现 - 例如STLPort.某些大公司也出于各种目的使用自己的STL内部端口.
使用C++ 03,可以仅使用可移植的C++语言功能编写STL的端口,这意味着任何符合标准的编译器都应该能够编译它.
但是对于C++ 11,没有某些特性需要编译器支持?
例如,我不知道如何std::is_standard_layout仅使用C++语言功能来实现.我认为std::is_base_of可以std::is_convertible使用base和派生指针来实现.但我无法想象如何std::is_standard_layout实施.可能还有其他功能,我没有想到.
那么,我在这里是否正确?是否仅使用C++语言功能在C++ 11中编写标准库的完整端口是不可能的?
*我知道STL和"C++标准库"不是严格可互换的,但显然我的意思是这种情况下的C++标准库.
在C++ 03中编程时,我们无法将未命名的临时文件T()传递给函数void foo(T&);.通常的解决方案是给临时名称,然后传递它:
T v;
foo(v);
Run Code Online (Sandbox Code Playgroud)
现在,沿着C++ 0x - 现在使用rvalue引用,定义为的函数void foo(T&&)将允许我传递临时值.这让我想到了一个问题:因为一个采用右值引用的函数可以同时使用右值引用(未命名的临时值)以及左值引用(命名为非const引用),是否有理由在函数参数中再使用左值引用?我们不应该总是使用rvalues作为函数参数吗?
当然,一个采用左值引用的函数会阻止调用者传递临时值,但我不确定这是否是一个有用的限制.
splitPython中的默认方法将连续空格视为单个分隔符.但是,如果指定分隔符字符串,则不会折叠连续分隔符:
>>> 'aaa'.split('a')
['', '', '', '']
Run Code Online (Sandbox Code Playgroud)
折叠连续分隔符最简单的方法是什么?我知道我可以从结果列表中删除空字符串:
>>> result = 'aaa'.split('a')
>>> result
['', '', '', '']
>>> result = [item for item in result if item]
Run Code Online (Sandbox Code Playgroud)
但是有更便捷的方式吗?
一些现代浏览器支持HTML5"oninput"事件,包括Firefox 3.X
然而,奇怪的是,它似乎只适用于内联javascript:
<input id = "q" oninput="alert('blah')">
Run Code Online (Sandbox Code Playgroud)
当我尝试使用javascript代码设置它时,它不会触发.
var q = document.getElementById("q");
q.oninput = function(){alert("blah");};
Run Code Online (Sandbox Code Playgroud)
这只是Firefox中的一个错误,还是有这样的原因?
我刚刚读完了CERT工作的Brian Seacord 在C和C++中读取的安全编码.
总的来说,这是一本很好的书,我会推荐给任何尚未阅读它的程序员.在阅读之后,我发现对于所有各种类型的安全漏洞(例如漏洞利用代码注入,缓冲区溢出,整数溢出,字符串格式化漏洞等),每个安全漏洞似乎都归结为一件事:访问不受进程合法分配的缓冲区限制的内存地址的能力.
注入恶意代码或重新路由程序逻辑的能力完全取决于能够访问落在合法分配的缓冲区之外的内存地址.但是在像Java这样的语言中,这根本不可能.可能发生的最糟糕的事情是程序将终止ArrayIndexOutOfBoundsException,导致拒绝服务.
那么在Java等"安全"语言中是否存在任何安全漏洞,无法进行无效的内存访问?(我在这里使用Java作为示例,但我真的很想知道任何防止无效内存访问的语言中的安全漏洞.)
我不清楚语法!=和语法之间的区别is not.他们似乎做了同样的事情:
>>> s = 'a'
>>> s != 'a'
False
>>> s is not 'a'
False
Run Code Online (Sandbox Code Playgroud)
但是,当我is not在列表理解中使用时,它会产生与我使用时不同的结果!=.
>>> s = "hello"
>>> [c for c in s if c is not 'o']
['h', 'e', 'l', 'l', 'o']
>>> [c for c in s if c != 'o']
['h', 'e', 'l', 'l']
Run Code Online (Sandbox Code Playgroud)
为什么oget包含在第一个列表中,而不是第二个列表?
可能重复:
Python中的"最小惊讶":可变默认参数
我对Python中的类实例变量的字典行为非常困惑.我理解它的方式,Python中的实例变量具有每个实例的存储,不像每个类的类变量(类似于其他一些语言所调用的) "静态的").
这似乎是正确的,除非实例变量是从默认参数创建的字典.例如:
class Foo:
def __init__(self, values = dict()):
self.values = values
f1 = Foo()
f1.values["hello"] = "world"
f2 = Foo()
print(f2.values)
Run Code Online (Sandbox Code Playgroud)
该计划输出:
{'hello': 'world'}
Run Code Online (Sandbox Code Playgroud)
咦?为什么实例f2具有相同的字典实例f1?
如果我没有将空字典作为默认参数传入,并且只是self.values明确地分配给空字典,我会得到预期的行为:
class Foo:
def __init__(self):
self.values = dict()
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么这应该有所不同.
在CSS中,a em是基于文档字体大小的相对单位.那么,em如果文件本身的字体大小是用ems测量的那么究竟是什么呢?假设我们说:
<style type = "text/css">
body
{
font-size: 1em;
}
</style>
Run Code Online (Sandbox Code Playgroud)
所以,em现在递归地定义了一个.那么这是如何由浏览器处理的?
在W3C文档说:
'em'单位等于使用它的元素的'font-size'属性的计算值.例外情况是'em'出现在'font-size'属性本身的值中,在这种情况下它引用父元素的字体大小.它可用于垂直或水平测量.(此单位有时也称为印刷文本中的四边形.)
但是如果元素是document.body,那么没有父元素呢?
所以,我刚刚完成了一个大型服务器应用程序的艰苦的多小时调试会话.错误最终归结为构造函数中几乎没有明显的错字.基本上,它是这样的:
template <class T>
class request_handler
{
public:
request_handler(T& request, Log& error_log)
: m_request(m_request), m_error_log(error_log)
{
/*... some code ... */
}
...
};
Run Code Online (Sandbox Code Playgroud)
看到这个bug?好吧,我没有.问题是初始化列表中的一个小错误:m_request(m_request)正在为自己分配一个未初始化的引用.显然,它应该阅读m_request(request).
现在,成员变量m_request是类型T&.那么 - 是否有一些原因编译器没有警告我我在这里使用了一个未初始化的变量?
使用带有-Wall标志的GCC 4.6 ,如果我说:
int x;
x = x;
Run Code Online (Sandbox Code Playgroud)
......它会发出警告: warning: ‘x’ is used uninitialized in this function [-Wuninitialized]
那么,当我分配m_request给自己时,编译器为什么不警告我:基本上为自己分配一个未初始化的引用?这本来可以节省我几个小时的烦恼.