这本书告诉写作:
static unsigned int foo;
以后
if( foo > 0)
{
是错误的,它会导致很难找到错误。 那是为什么?
在x86汇编语言编程中有签名的算术指令和 也是无符号算术指令, JG JL<签名算术 JB JA< - 未签名的指令。
因此,编译器可以使用无符号指令组合if(foo> 0)语句 不是吗?有人可以提前解释它是如何运作的吗?
那条指令错了吗?或者如果“C”中存在“C ++”严格的差异 那个案子?请解释一下。
这里我们将无符号变量与立即值进行比较。里面发生了什么 在这种情况下,编译器实际上是什么?
当我们将有符号值与无符号值进行比较时会发生什么?那么编译器会选择哪些指令,签名指令或无符号指令?
- 提前感谢 -
答案 0 :(得分:2)
这个问题不应该在汇编程序的水平上回答,而应该在c / c ++语言水平上回答。在大多数体系结构中,不可能比较有符号和无符号数,而c / c ++不利于这种比较。相反,有一些关于将其中一个操作数转换为另一个操作数的规则以便进行比较 - 例如参见this question
的aswers关于与文字进行比较 - 这样做的典型方式(正如你所做的那样)并没有错,但你可以做得更好 - 根据c ++标准:
2.13.1.1整数文字是一个没有句点的数字序列 或指数部分。整数文字可以具有指定的前缀 它的基数和指定其类型的后缀。词汇首先 数字序列的数字是最重要的。小数 整数文字(基数十)以0以外的数字开头 十进制数字序列的sists。八进制整数文字(基数 八)以数字0开始,包括八进制序列 digits.22)十六进制整数文字(十六进制)以0x开头 或0X,由一系列十六进制数字组成,包括 十进制数字和字母a到f和A到F with 十进制值十到十五。 [例子:十二号可以 写入12,014或0XC。 ]
2.13.1.2整数文字的类型取决于它的形式,值, 和后缀。如果它是十进制且没有后缀,则它具有第一个 这些类型的值可以表示为:int,long int;如果 该值不能表示为long int,行为是 未定义。如果它是八进制或十六进制且没有后缀,则它具有这些类型中的第一个,其值可以表示为:int, unsigned int,long int,unsigned long int。如果以u或者为后缀 U,它的类型是其值可以是这些类型中的第一种 表示:unsigned int,unsigned long int。如果以l为后缀 或者L,它的类型是其值可以是这些类型中的第一种 表示:long int,unsigned long int。如果以ul,lu为后缀, uL,Lu,U1,lU,UL或LU,其类型为unsigned long int。
如果你想确定你的文字类型(以及comaprison类型)添加所描述的后缀以确保正确的文字类型。
值得注意的是,文字0
实际上不是小数而是八进制 - 它似乎没有改变任何东西,但是非常意外 - 或者我错了?
总结一下 - 编写这样的代码并没有错,但你应该记住,在某些情况下可能会表现出违反直觉(或者至少是反数学的);