我在执行以下代码时遇到了这个问题:
int average = std::accumulate(vi.begin(), vi.end(), 0) / vi.size();
Run Code Online (Sandbox Code Playgroud)
没有int对vi.size()输出进行强制转换是垃圾,因为size()返回一个无符号整数。
如果我没有在 google 上搜索 vector 的参考资料,我永远不会想到这一点。有没有办法避免这个陷阱?使用-Walland -pedantic,gcc 似乎没有给出关于这种划分的任何警告。
我只是在学习 NASM,我正在努力解决这个问题。你如何在 NASM 中声明变量?例如,您将如何unsigned int i在 NASM 中声明?谢谢
请考虑以下代码:
for(unsigned i = 0; i < counter1; i++) {
for(unsigned j = 0; j < counter2; j++) {
// some code here
}
}
Run Code Online (Sandbox Code Playgroud)
使用unsigned int而不仅仅是int在这种情况下有什么好处吗?现代编译器会以某种方式对其进行优化,还是唯一的好处就是更大的尺寸unsigned int?
我想弄清楚为什么以下代码:
{
unsigned int a = 10;
a = ~a;
printf("%d\n", a);
}
Run Code Online (Sandbox Code Playgroud)
a将00001010开始,并且在NOT opertaion之后,将变换
进入11110101.
当一个人试图打印a为有符号整数时,会发生什么
打印结果是-11?
我以为我最终会看到-5可能(根据二进制表示),但不是-11.
我很乐意对此事作出澄清.
我一直在尝试unsigned short int用 C打印值,但没有运气。据我所知,它是一个 16 位值,所以我尝试了几种不同的方法来将这 2 个字节打印在一起,但是我只能在逐字节打印时正确打印它。
请注意,我想以十进制和十六进制格式打印这 16 位,例如00 01as 1,另一个示例是:00 ffas 255。
我有这个结构:
struct arphdr {
unsigned short int ar_hrd;
unsigned short int ar_pro;
unsigned char ar_hln;
unsigned char ar_pln;
unsigned short int ar_op;
// I'm commenting the following part because I won't need it now
// for the explanation
/* unsigned char __ar_sha[ETH_ALEN];
unsigned char __ar_sip[4];
unsigned char __ar_tha[ETH_ALEN];
unsigned char __ar_tip[4]; */
};
Run Code Online (Sandbox Code Playgroud)
而这个功能:
void print_ARP_msg(struct arphdr …Run Code Online (Sandbox Code Playgroud) 我正在做以下比较:
uint32_t value = 1000;
if(value < 100)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,什么 get 被投射到什么?“值”是否被强制转换为整数?100 是否被转换为整数或无符号整数?
#include <iostream>
#include <cstdint>
using namespace std;
static_assert(-1 == numeric_limits<uint64_t>::max()); // ok
static_assert(-1 == numeric_limits<uint32_t>::max()); // ok
static_assert(-1 == numeric_limits<uint16_t>::max()); // error
int main()
{
cout << numeric_limits<uint16_t>::max() << endl;
cout << uint16_t(-1) << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
65535
65535
Run Code Online (Sandbox Code Playgroud)
为什么 numeric_limits<uint16_t>::max() 不等于-1?
更新:
根据cppref:
类似地,USHRT_MAX 可能不是无符号类型:它的类型可能是 int。
c++ standards numeric compile-time-constant unsigned-integer
我在X86中测试了这段代码.
void func()
{
int a, b;
unsigned int c, d;
int ret;
ret = a / b; // This line use idivl, expected
ret = c / d; // this line use idivl, expected
ret = a / c; // this line use divl..., surprised
ret = c / a; // this line use divl..., supriised
ret = a * c; // this line use imull, expected
}
Run Code Online (Sandbox Code Playgroud)
我在这里粘贴汇编代码:
func:
pushl %ebp
movl %esp, %ebp
subl $36, %esp
movl …Run Code Online (Sandbox Code Playgroud) 如果我input.size() - 1用作for循环条件,程序将打印"进入循环" .
std::string input;
input = {""};
int i = 0;
for (; i < input.size() - 1; ++i)
{
cout << "Entered the loop" << endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将值传递input.size() -1给整数(checksize):
std::string input;
input = {""};
int checksize = input.size() - 1;
int i = 0;
for (; i < checksize; ++i)
{
cout << "Entered the loop" << endl;
}
Run Code Online (Sandbox Code Playgroud)
然后程序将不会进入循环并且不会打印"进入循环"
我想知道为什么会这样?看来这两段代码对我来说是一样的.
我试图为unsigned int分配一个数字,但它会导致错误.我想只要数字介于0和2 ^ 32之间,它应该可以工作.这是我的代码.
unsigned int number = 4026658824;
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误.
错误:根据1999 ISO C标准不断推广