根据C和C++ , CHAR_BIT >= 8.
但无论何时CHAR_BIT > 8,uint8_t甚至都不能表示为8位.
它必须更大,因为它CHAR_BIT是系统上任何数据类型的最小位数.
什么样的系统可以uint8_t合法地定义为除了以外的类型unsigned char?
(如果C和C++的答案不同,那么我想知道两者.)
我正在阅读关于按位运算符的章节,我遇到了1的补码运算符程序,并决定在Visual C++上运行它.
int main ()
{
unsigned char c = 4, d;
d = ~c;
printf("%d\n", d);
}
Run Code Online (Sandbox Code Playgroud)
它给出了有效的输出: 251
然后我决定直接打印值,而不是d用作变量来保存~c值~c.
int main ()
{
unsigned char c=4;
printf("%d\n", ~c);
}
Run Code Online (Sandbox Code Playgroud)
它给出了输出-5.
它为什么不起作用?
显然,编译器认为它们是不相关的类型,因此reinterpret_cast是必需的.为什么这是规则?
人们经常需要一次一个字节地读取内存,就像在这个天真的memcpy()实现中一样:
void *memcpy(void *dest, const void *src, size_t n)
{
char *from = (char *)src;
char *to = (char *)dest;
while(n--) *to++ = *from++;
return dest;
}
Run Code Online (Sandbox Code Playgroud)
但是,我有时会看到人们明确使用unsigned char *而不仅仅是char *.
当然,char和unsigned char可能不相等.但这是否有所作为我是否使用char *,signed char *或unsigned char *当按字节读取/写入内存?
更新:实际上,我完全清楚c=200可能有不同的值,具体取决于类型c.我在这里问的是为什么人们有时会使用unsigned char *而不是仅仅char *在阅读记忆时,例如为了存储uint32_t一个char[4].
我有一个无符号的int数(2字节),我想将其转换为unsigned char类型.从我的搜索中,我发现大多数人建议您执行以下操作:
unsigned int x;
...
unsigned char ch = (unsigned char)x;
Run Code Online (Sandbox Code Playgroud)
是正确的方法吗?我问,因为unsigned char是1个字节,我们从2字节数据转换为1个字节.
为了防止任何数据丢失,我想创建一个unsigned char []数组并将各个字节保存到数组中.我被困在以下方面:
unsigned char ch[2];
unsigned int num = 272;
for(i=0; i<2; i++){
// how should the individual bytes from num be saved in ch[0] and ch[1] ??
}
Run Code Online (Sandbox Code Playgroud)
另外,我们如何将unsigned char [2]转换回unsigned int.
非常感谢.
这不起作用:
unsigned char foo;
foo = 0x123;
sprintf("the unsigned value is:%c",foo);
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
无法将参数2从'unsigned char'转换为'char'
将unsigned char数组复制到另一个的最佳方法是什么?
例如:
unsigned char q[1000];
unsigned char p[1000];
strcpy (q,&p);
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用,它给我错误说"无法将参数1从unsigned char [1000]转换为char*".
我正在使用2个库.一个接受并返回std::strings而另一个使用std::vector<unsigned char>s.
这将是很好的,如果我可以从偷底层阵列std::string和std::vector<unsigned char>并能够将其移动到对方没有过多的复制.
ATM我使用的东西如下:
const unsigned char* raw_memory =
reinterpret_cast<const unsigned char*>(string_value.c_str()),
std::vector<unsigned char>(raw_memory, raw_memory + string_value.size();
Run Code Online (Sandbox Code Playgroud)
另一种方式:
std::string(
reinterpret_cast<const char*>(&vector_value[0]),
vector_value.size());
Run Code Online (Sandbox Code Playgroud)
能够定义一个以下内容会好得多:
std::string move_into(std::vector<unsigned char>&&);
std::vector<unsigned char> move_into(std::string&&);
Run Code Online (Sandbox Code Playgroud) 这是一个代码 -
1 int main(int argc, char *argv[])
2 {
3 signed char S, *psc;
4 unsigned char U, *pusc;
5 char C, *pc;
6
7 C = S;
8 C = U;
9
10 pc = psc;
11 pc = pusc;
12
13 return 0;
14 }
$ gcc test.cpp -o a
test.cpp: In function ‘int main(int, char**)’:
test.cpp:10:7: error: invalid conversion from ‘signed char*’ to ‘char*’ [-fpermissive]
test.cpp:11:7: error: invalid conversion from ‘unsigned char*’ to ‘char*’ [-fpermissive]
Run Code Online (Sandbox Code Playgroud)
这是在英特尔32位机器上的Ubuntu …
我有std :: string变量.我需要从无符号字符数组中加入一些字节.我知道第一个字节和第一个字节.
我可以使用std :: string :: assign函数.我做到了
但我想使用memcpy函数以正确的方式解决该问题.
std::string newString;
memcpy(&newString, &bytes[startIndex], length);
Run Code Online (Sandbox Code Playgroud)
我知道这是错的.我已经使用std :: vector研究并发现了一些想法.
请帮我找到这个问题最优雅的解决方案.