静态无符号 int foo 和更高之后的 if ( foo >0 )?
Static unsigned int foo and later if ( foo >0 )?
书中说:
static unsigned int foo;
和
if( foo > 0)
{
是错误的,它将导致一个难以发现的bug。为什么呢?
在x86汇编语言程序设计中有符号算术指令和还有无符号算术指令,JG JL <-符号算术JB JA <-无符号指令。
编译器可以将if (foo>0)语句与无符号指令组合在一起不是吗?谁能提前解释一下它是怎么工作的?
这个说明是错的吗?或者在"C"中有区别,而"c++"是严格的这种情况下吗?请解释。
这里我们比较的是一个无符号变量和一个直接值。里面发生了什么编译器在这种情况下?
当我们比较有符号值和无符号值时会发生什么?那么编译器会选择什么指令,有符号指令还是无符号指令?
—thanks in advance—
这个问题不应该在汇编语言的层次上回答,而应该在c/c++语言层次上回答。在大多数体系结构中,比较有符号数和无符号数是不可能的,而c/c++不支持这种比较。相反,有一些规则是关于将其中一个操作数转换为另一个操作数的类型,以便对它们进行比较——参见以下问题的示例答案
关于比较字面量-典型的做法(如你所做的)并没有错,但你可以做得更好-根据c++标准:
2.13.1.1整数字面值是不带句号的数字序列或者指数部分。整数字面值可以有一个前缀来指定它的基和指定其类型的后缀。首先是词汇数字序列中最重要的一位。一个小数整数字面值(以10为基数)以0和con-以外的数字开头由一串十进制数字组成。一个八进制整数字面值(基数)8)以数字0开头,由一个八进制数列组成十六进制整数字面值(以16为基数)以0x开头或0X,由十六进制数字序列组成,其中包括十进制数字和字母a到f和a到f with十进制值从10到15。[示例:数字12可以是。写为12、014或0XC。)
2.13.1.2整数字面值的类型取决于它的形式、value、和后缀。如果它是十进制且没有后缀,则它是其中的第一个可以表示其值的类型:int, long int;如果该值不能表示为长整型,其行为是未定义的。如果它是八进制或十六进制且没有后缀,则它具有以下类型中第一个可以表示其值的类型:Unsigned int, long int, Unsigned long int。如果以u或为后缀U,它的类型是它的值可以存在的第一个类型表示:无符号整型,无符号长整型。如果以1为后缀或者L,它的类型是它的值可以存在的第一个类型表示:long int, unsigned long int。如果后缀是ul, lu,uL、Lu、uL、Lu、uL或Lu,其类型为unsigned long int。
如果您想确定您的文字类型(因此比较类型),请添加描述后缀以确保文字的正确类型。
同样值得注意的是,文字0
实际上不是十进制的,而是八进制的——它似乎没有改变任何东西,但是非常出乎意料——或者我错了吗?
总而言之——这样写代码并没有错,但你应该记住,在某些情况下,in可能会表现得反直觉(或至少反数学;)
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- Is there any reason for using if(1 || !Foo())?
- 为什么C++编译器无法优化"if(test) --foo"以"foo -= test"?
- 静态无符号 int foo 和更高之后的 if ( foo >0 )?
- 使用 if(0 == foo()) 而不是 (foo() == 0) 有什么好处?