gpt4 book ai didi

c++ - 它是g++中的错误吗?

转载 作者:IT老高 更新时间:2023-10-28 21:51:05 26 4
gpt4 key购买 nike

#include <stdint.h>
#include <iostream>

using namespace std;

uint32_t k[] = {0, 1, 17};

template <typename T>
bool f(T *data, int i) {
return data[0] < (T)(1 << k[i]);
}

int main() {
uint8_t v = 0;
cout << f(&v, 2) << endl;
cout << (0 < (uint8_t)(1 << 17)) << endl;
return 0;
}


g++ a.cpp && ./a.out
1
0

为什么我会得到这些结果?

最佳答案

看起来 gcc 反转了转移并将其应用于另一侧,我猜这是一个错误。

在 C(而不是 C++)中也会发生同样的事情,并且将 C 翻译成 asm 更容易阅读,所以我在这里使用 C;我还减少了测试用例(删除模板和 k 数组)。foo() 是原始的错误 f() 函数,foo1() 是 foo() 在 gcc 中的行为,但不应该,而 bar() 显示了 foo() 除了指针读取之外应该是什么样子。

我是64位的,但是32位除了参数处理和查找k之外都是一样的。

#include <stdint.h>
#include <stdio.h>

uint32_t k = 17;
char foo(uint8_t *data) {
return *data < (uint8_t)(1<<k);
/*
with gcc -O3 -S: (gcc version 4.7.2 (Debian 4.7.2-5))
movzbl (%rdi), %eax
movl k(%rip), %ecx
shrb %cl, %al
testb %al, %al
sete %al
ret
*/
}
char foo1(uint8_t *data) {
return (((uint32_t)*data) >> k) < 1;
/*
movzbl (%rdi), %eax
movl k(%rip), %ecx
shrl %cl, %eax
testl %eax, %eax
sete %al
ret
*/
}
char bar(uint8_t data) {
return data < (uint8_t)(1<<k);
/*
movl k(%rip), %ecx
movl $1, %eax
sall %cl, %eax
cmpb %al, %dil
setb %al
ret
*/
}

int main() {
uint8_t v = 0;
printf("All should be 0: %i %i %i\n", foo(&v), foo1(&v), bar(v));
return 0;
}

关于c++ - 它是g++中的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14423483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com