静态无符号 int foo 和更高之后的 if ( foo >0 )?

Static unsigned int foo and later if ( foo >0 )?

本文关键字:foo if gt int 无符号 静态 高之后 之后      更新时间:2023-10-16

书中说:

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可能会表现得反直觉(或至少反数学;)